如何操作 xml 文件并将其保存到磁盘?
How to manipulate a xml file and save it to disk?
我有两个 xml 结构完全相同的文件。唯一的区别是标签的内部文本。
我想用第二个文件中的相应值替换第一个文件中的值。
我试过使用 xml2json,但问题是它删除了我在最终输出中需要的所有注释。
所以目前我正在使用 xmldom。
我能够操作文本,但是当我尝试将文件保存到磁盘时更改丢失了。
var DOMParser = require("xmldom").DOMParser;
var serializer = new (require('xmldom')).XMLSerializer;
var fs = require('fs');
let firstXML = `<root>
<!--This is just a comment-->
<string name="one">SOMETHING</string>
</root>`
let secondXML = `<root>
<string name="one">ELSE</string>
</root>`
var firstDoc = new DOMParser().parseFromString(firstXML, "text/xml");
var secondDoc = new DOMParser().parseFromString(secondXML, "text/xml");
let elementsFirst = firstDoc.getElementsByTagName("string");
let elementsSecond = secondDoc.getElementsByTagName("string");
for(let i = 0; i < elementsFirst.length; ++i) {
let el = elementsFirst[i];
let name = el.getAttribute("name");
for(let j = 0; j < elementsSecond.length; ++j) {
if(name = elementsSecond[j].getAttribute("name")) {
el.firstChild.nodeValue = elementsSecond[j].firstChild.nodeValue;
break;
}
}
}
fs.writeFileSync("output.xml", serializer.serializeToString(firstDocs));
//Required output
`<root>
<!--This is just a comment-->
<string name="one">ELSE</string>
</root>`
请不要问我为什么,但是如果你替换这一行
el.firstChild.nodeValue = elementsSecond[j].firstChild.nodeValue;
有了这个
el.firstChild.data = elementsSecond[j].firstChild.nodeValue;
它将按预期工作。
P.S。您的 if
语句有错字,您需要 ===
,单个 =
通常会 return true
更新:找到解决方案后 - 我发现它与
重复
我有两个 xml 结构完全相同的文件。唯一的区别是标签的内部文本。 我想用第二个文件中的相应值替换第一个文件中的值。
我试过使用 xml2json,但问题是它删除了我在最终输出中需要的所有注释。 所以目前我正在使用 xmldom。 我能够操作文本,但是当我尝试将文件保存到磁盘时更改丢失了。
var DOMParser = require("xmldom").DOMParser;
var serializer = new (require('xmldom')).XMLSerializer;
var fs = require('fs');
let firstXML = `<root>
<!--This is just a comment-->
<string name="one">SOMETHING</string>
</root>`
let secondXML = `<root>
<string name="one">ELSE</string>
</root>`
var firstDoc = new DOMParser().parseFromString(firstXML, "text/xml");
var secondDoc = new DOMParser().parseFromString(secondXML, "text/xml");
let elementsFirst = firstDoc.getElementsByTagName("string");
let elementsSecond = secondDoc.getElementsByTagName("string");
for(let i = 0; i < elementsFirst.length; ++i) {
let el = elementsFirst[i];
let name = el.getAttribute("name");
for(let j = 0; j < elementsSecond.length; ++j) {
if(name = elementsSecond[j].getAttribute("name")) {
el.firstChild.nodeValue = elementsSecond[j].firstChild.nodeValue;
break;
}
}
}
fs.writeFileSync("output.xml", serializer.serializeToString(firstDocs));
//Required output
`<root>
<!--This is just a comment-->
<string name="one">ELSE</string>
</root>`
请不要问我为什么,但是如果你替换这一行
el.firstChild.nodeValue = elementsSecond[j].firstChild.nodeValue;
有了这个
el.firstChild.data = elementsSecond[j].firstChild.nodeValue;
它将按预期工作。
P.S。您的 if
语句有错字,您需要 ===
,单个 =
通常会 return true
更新:找到解决方案后 - 我发现它与