如何使用xml-writer在已有XML标签内添加多个子标签?
解决xml-writer添加子标签跑到父标签外的问题
问题出在xml-writer的自动闭合逻辑和标签上下文管理上,调整标签的开闭时机就能解决:
核心原因
你最初的createEmptyXML函数里,<Hello>标签因为没有子元素,被xml-writer自动处理成了自闭合标签<Hello .../>。第一次添加子标签时,writer会临时把它改成开放标签<Hello ...>来容纳子元素,但如果没手动控制父标签的闭合时机,后续操作会让writer误以为父标签已经闭合,导致新的子标签跑到外部。
修正方案
- 保持父标签开放:创建
<Hello>后不要让它自动闭合,去掉隐含的自闭合逻辑。 - 批量添加子标签:所有子标签都添加完成后,再手动闭合父标签。
- 复用子标签添加逻辑:用带参数的函数统一处理子标签添加。
完整示例代码
const XMLWriter = require('xml-writer'); const xw = new XMLWriter(); // 初始化XML结构,保持Hello标签开放 function createEmptyXML(xw) { xw.startDocument(); xw.startElement('Hello'); xw.writeAttribute('name', '_nameOfThePerson'); } // 通用添加子标签函数 function addChildTag(xw, tagName) { xw.startElement('childTag') .writeAttribute('name', tagName); // 无内容的子标签会被xml-writer自动闭合,无需手动调用endElement } // 执行流程 createEmptyXML(xw); addChildTag(xw, 'A'); addChildTag(xw, 'B'); // 所有子标签添加完成后,手动闭合Hello标签 xw.endElement(); xw.endDocument(); // 输出结果 console.log(xw.toString());
生成的正确XML
<?xml version="1.0"?> <Hello name="_nameOfThePerson"> <childTag name="A"/> <childTag name="B"/> </Hello>
注意点
你之前预期的XML结构是无效的:<Hello .../>是自闭合标签,后面不能再跟子元素和</Hello>结束标签,必须用开放的<Hello>标签包裹子元素,最后再闭合。
内容的提问来源于stack exchange,提问作者CraZyDroiD
相关产品推荐
相关产品推荐

