xml是一种常用的结构化数据格式,在很多系统中用于配置文件存储、数据交换等场景,当需要调整xml里的内容时,有多种成熟的技术方案可以选择,不同方案的操作逻辑和适用场景存在差异。

使用DOM方式修改xml内容
DOM即文档对象模型,会把整个xml文档解析成树形结构加载到内存中,开发者可以直接操作树上的节点来完成内容修改,这种方式逻辑直观,适合处理体积不大的xml文件。
Python实现示例
Python标准库中的xml.dom.minidom模块可以很方便地实现DOM方式的xml修改,下面是修改xml节点内容的完整示例:
import xml.dom.minidom
# 原始xml内容示例
xml_content = """<?xml version="1.0" encoding="UTF-8"?>
<config>
<database>
<host>127.0.0.1</host>
<port>3306</port>
<username>root</username>
</database>
</config>"""
# 解析xml内容
doc = xml.dom.minidom.parseString(xml_content)
# 获取要修改的host节点
host_nodes = doc.getElementsByTagName("host")
if host_nodes:
# 修改节点文本内容
host_nodes[0].firstChild.data = "192.168.0.1"
# 获取根节点,准备新增节点
config_node = doc.getElementsByTagName("config")[0]
# 创建新的timeout节点
timeout_node = doc.createElement("timeout")
timeout_text = doc.createTextNode("30")
timeout_node.appendChild(timeout_text)
# 把新节点添加到database节点下
database_node = doc.getElementsByTagName("database")[0]
database_node.appendChild(timeout_node)
# 输出修改后的xml内容
print(doc.toxml())
Java实现示例
Java中可以使用自带的javax.xml.parsers包下的类实现DOM方式修改xml,示例如下:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.io.ByteArrayInputStream;
public class XmlModifyDemo {
public static void main(String[] args) throws Exception {
String xmlContent = "<?xml version="1.0" encoding="UTF-8"?>n" +
"<config>n" +
" <database>n" +
" <host>127.0.0.1</host>n" +
" <port>3306</port>n" +
" <username>root</username>n" +
" </database>n" +
"</config>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(xmlContent.getBytes("UTF-8")));
// 修改host节点内容
NodeList hostNodes = doc.getElementsByTagName("host");
if (hostNodes.getLength() > 0) {
hostNodes.item(0).setTextContent("192.168.0.1");
}
// 新增timeout节点
NodeList databaseNodes = doc.getElementsByTagName("database");
if (databaseNodes.getLength() > 0) {
Element timeoutElement = doc.createElement("timeout");
timeoutElement.setTextContent("30");
databaseNodes.item(0).appendChild(timeoutElement);
}
// 输出修改后的xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
}
}
使用SAX方式修改xml内容
SAX是事件驱动的流式解析方式,不会把整个xml加载到内存,适合处理体积很大的xml文件,修改时需要通过自定义处理器记录需要修改的位置,重新生成xml内容。
Python实现示例
Python的xml.sax模块可以实现SAX方式的xml修改,示例如下:
import xml.sax
from xml.sax.handler import ContentHandler
class XmlModifyHandler(ContentHandler):
def __init__(self):
self.current_tag = ""
self.result_lines = []
def startElement(self, name, attrs):
self.current_tag = name
# 拼接开始标签
attr_str = " ".join([f'{k}="{v}"' for k, v in attrs.items()])
if attr_str:
self.result_lines.append(f"<{name} {attr_str}>")
else:
self.result_lines.append(f"<{name}>")
def characters(self, content):
# 如果是host标签,修改内容
if self.current_tag == "host":
self.result_lines.append("192.168.0.1")
else:
self.result_lines.append(content)
def endElement(self, name):
self.result_lines.append(f"</{name}>")
self.current_tag = ""
# 原始xml内容
xml_content = """<?xml version="1.0" encoding="UTF-8"?>
<config>
<database>
<host>127.0.0.1</host>
<port>3306</port>
</database>
</config>"""
# 创建处理器和解析器
handler = XmlModifyHandler()
parser = xml.sax.make_parser()
parser.setContentHandler(handler)
# 解析xml
import io
parser.parse(io.StringIO(xml_content))
# 输出修改后的xml
print("n".join(handler.result_lines))
两种修改方式对比
不同修改方式的特点和适用场景如下,可以根据实际需求选择:
| 修改方式 | 内存占用 | 操作复杂度 | 适用场景 |
|---|---|---|---|
| DOM方式 | 较高,需要加载整个文档 | 低,直接操作节点 | 小体积xml文件,频繁修改多个节点 |
| SAX方式 | 低,流式处理 | 较高,需要自定义处理逻辑 | 大体积xml文件,仅少量节点修改 |
修改xml的注意事项
- 修改前最好备份原始xml文件,避免修改出错后无法恢复
- 修改节点内容时要注意编码格式,避免出现乱码问题
- 如果xml有DTD或者Schema约束,修改后的内容要符合约束规则,否则可能导致解析失败
- 操作<?xml version="1.0"?>这类声明节点时,要注意保留原始编码和版本信息
xmldomSAXPython_xml_parse修改时间:2026-06-15 09:42:35