XML文档的结构化特性让它在配置存储、数据交换场景中应用广泛,XPath作为XML路径语言,可以快速定位到文档中的任意节点,结合对应的解析库就能实现XML内容的修改操作。不同编程语言的XML解析库对XPath的支持略有差异,但核心逻辑都是先解析XML文档,再用XPath定位目标节点,最后执行修改操作。

XPath基础定位语法
在使用XPath修改内容前,需要先掌握基础的定位规则,常用的定位表达式如下:
/:从根节点开始定位//:从任意位置开始定位匹配的节点@:定位节点的属性text():定位节点的文本内容- 谓语
[]:添加过滤条件,比如//book[@id='1']表示定位id属性为1的book节点
使用Python lxml库修改XML内容
Python的lxml库对XPath支持完善,是处理XML的常用工具,首先需要安装库:
# 安装lxml库 pip install lxml
修改节点文本内容
假设我们有如下的XML文档,需要修改id为1的book节点的title内容:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1">
<title>Python基础教程</title>
<author>张三</author>
<price>59.9</price>
</book>
<book id="2">
<title>Java进阶指南</title>
<author>李四</author>
<price>69.9</price>
</book>
</library>
使用XPath定位并修改文本内容的代码如下:
from lxml import etree
# 解析XML文档
xml_content = """<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1">
<title>Python基础教程</title>
<author>张三</author>
<price>59.9</price>
</book>
<book id="2">
<title>Java进阶指南</title>
<author>李四</author>
<price>69.9</price>
</book>
</library>"""
root = etree.fromstring(xml_content.encode('utf-8'))
# 使用XPath定位id为1的book下的title节点
target_titles = root.xpath("//book[@id='1']/title")
if target_titles:
# 修改节点文本内容
target_titles[0].text = "Python高级编程"
# 输出修改后的XML内容
print(etree.tostring(root, encoding='utf-8').decode('utf-8'))
修改节点属性
如果需要修改book节点的id属性,代码示例如下:
from lxml import etree
xml_content = """<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1">
<title>Python基础教程</title>
<author>张三</author>
<price>59.9</price>
</book>
</library>"""
root = etree.fromstring(xml_content.encode('utf-8'))
# 定位id为1的book节点
target_books = root.xpath("//book[@id='1']")
if target_books:
# 修改id属性值
target_books[0].set('id', '1001')
# 新增category属性
target_books[0].set('category', '编程')
print(etree.tostring(root, encoding='utf-8').decode('utf-8'))
新增和删除节点
通过XPath定位父节点后,可以实现子节点的新增和删除:
from lxml import etree
xml_content = """<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1">
<title>Python基础教程</title>
<author>张三</author>
</book>
</library>"""
root = etree.fromstring(xml_content.encode('utf-8'))
# 定位id为1的book节点作为父节点
target_books = root.xpath("//book[@id='1']")
if target_books:
parent = target_books[0]
# 新增price子节点
new_price = etree.SubElement(parent, 'price')
new_price.text = '59.9'
# 删除author子节点
author_nodes = parent.xpath('./author')
if author_nodes:
parent.remove(author_nodes[0])
print(etree.tostring(root, encoding='utf-8').decode('utf-8'))
使用Java dom4j库修改XML内容
Java生态中dom4j是常用的XML解析库,同样支持XPath操作,首先需要引入依赖:
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
修改节点文本内容的代码示例如下:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.StringReader;
import java.util.List;
public class XmlModifyDemo {
public static void main(String[] args) throws DocumentException {
String xmlContent = "<?xml version="1.0" encoding="UTF-8"?>n" +
"<library>n" +
" <book id="1">n" +
" <title>Python基础教程</title>n" +
" <author>张三</author>n" +
" <price>59.9</price>n" +
" </book>n" +
"</library>";
SAXReader reader = new SAXReader();
Document document = reader.read(new StringReader(xmlContent));
Element root = document.getRootElement();
// 使用XPath定位节点
List<Node> titleNodes = root.selectNodes("//book[@id='1']/title");
if (!titleNodes.isEmpty()) {
Node titleNode = titleNodes.get(0);
// 修改文本内容
titleNode.setText("Python高级编程");
System.out.println(document.asXML());
}
}
}
修改注意事项
- 修改前需要确认XPath表达式定位到的节点数量,避免误修改其他节点
- 修改后如果需要保存到文件,要使用对应的输出流写入,注意编码格式和原文档保持一致
- 如果XML文档有命名空间,XPath表达式需要包含命名空间前缀,否则无法正确定位节点
- 操作大体积XML文档时,建议使用流式解析方式,避免内存占用过高
XMLXPathXML修改dom4jPython_lxml修改时间:2026-07-11 20:57:37