XML 需用 DOMParser 解析为 DOM 才能操作,修改后用 XMLSerializer 序列化;注意大小写敏感、命名空间、文本节点与混合内容的区别及特殊字符转义。

XML 文档必须先解析成 DOM 才能用 JS 修改
HTML5 本身不提供直接操作 XML 文件的 API,XMLHttpRequest 或 fetch() 获取的 XML 字符串只是文本,不能直接调用 textContent 或 setAttribute()。必须用 DOMParser 解析为可操作的 XML DOM 对象。
- 浏览器 原生支持
DOMParser,但只在文档类型为"text/xml"或"application/xml"时正确解析;若服务端返回Content-Type: text/plain,即使内容是 XML,DOMParser也会报错或返回空文档 - 解析失败时,
parser.parseFromString(xmlStr, "text/xml")返回的文档中documentElement可能为null,或存在parser.error(仅 Firefox 支持),建议先检查doc.documentElement?.nodeName !== "parsererror" - XML 是严格区分大小写的,
getElementsByTagName("User")找不到节点
定位目标节点常用方法及注意事项
XML DOM 的节点查找和 HTML DOM 行为一致,但不支持 querySelector 的部分伪类(如 :nth-child)和 属性选择器 的简写(如 [id] 需写全 [id!=''])。
- 用
getElementsByTagName("item")获取所有同名元素,返回HTMLCollection(非数组),需用[0]或Array.from(……)转换 -
getElementById()仅在 XML 文档声明了 DTD 且含ID类型属性时有效,多数现代 XML(无 DTD)无法使用 - 推荐用
getElementsByTagNameNS("*", "title")处理带命名空间的 XML,避免因前缀变化(如dc:titlevsmedia:title)导致匹配失败
修改节点值的三种方式及其适用场景
XML 元素内容分“纯文本子节点”和“混合内容”(含子元素),修改方式不同,误用会导致结构损坏。
const doc = parser.parseFromString(`Old A B `, "text/xml"); // ✅ 正确:替换整个 title 元素的文本内容 doc.getElementsByTagName("title")[0].textContent = "New"; // ⚠️ 危险:直接改 first 元素的 textContent 会清空其所有子节点(虽然这里没有)doc.getElementsByTagName("first")[0].textContent = "X"; // ✅ 更安全(保留结构):只替换其第一个文本子节点 const first = doc.getElementsByTagName("first")[0]; if (first.firstChild && first.firstChild.nodeType === Node.TEXT_NODE) {first.firstChild.nodeValue = "X";}
-
textContent最常用,但会移除该元素内所有子节点(包括注释、CDATA、其他元素),仅适用于纯文本元素 -
nodeValue需精确指向文本节点(element.firstChild),适合混合内容中局部更新 - 新增 / 替换整个元素用
replaceChild(newEl, oldEl),例如把换成10 12.5
序列化回字符串并确保 编码 与格式正确
修改后的 XML DOM 必须用 XMLSerializer 转回字符串,否则直接 doc.toString() 或拼接会丢失结构。
立即学习“Java 免费学习笔记(深入)”;
-
new XMLSerializer().serializeToString(doc)输出无缩进、无声明的紧凑 XML;若需,需手动拼接(浏览器不自动添加) - 中文等 Unicode 字符默认被转义为
你,可通过设置doc.documentElement.setAttribute("xmlns", "")等方式抑制(不稳定),更可靠的是用encodeURI后再解码,或交由 后端 处理 - 如果后续要提交给服务端,注意
fetch的body传字符串时必须显式指定headers: {"Content-Type": "application/xml"},否则某些后端拒绝解析
XML 节点名、属性名、文本内容里的特殊字符(, &, ")不会自动转义,必须在设值前用 DOMPurify.sanitize() 或正则手动处理,否则生成的 XML 会非法。