Как манипулировать XML-файлом и сохранить его на диск? - PullRequest
0 голосов
/ 20 июня 2019

У меня есть два 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>`

1 Ответ

0 голосов
/ 20 июня 2019

Пожалуйста, не спрашивайте меня, почему, но если вы замените эту строку

el.firstChild.nodeValue = elementsSecond[j].firstChild.nodeValue;

с этим

el.firstChild.data = elementsSecond[j].firstChild.nodeValue;

будет работать как положено.

P.S. У вас есть опечатка в вашем if заявлении, вам нужно ===, один = будет обычно возвращать true

Обновление: после нахождения решения - я обнаружил, что это дубликат этого

...