I'm trying to merge two XML files using javascript into one whereby I'm copying over one node of one file into the other file. How do I go about doing this? I'm not sure how the solutions regarding XSLT work with javascript so are there any resources for xml manipulation using javascript?
File 1
<Salon>
<Member level="platinum">
<Name>Paul</Name>
<MembershipFee>1000</MembershipFee>
</Member>
</Salon>
File 2
<Salon>
<Member level="platinum">
<Name>James</Name>
<MembershipFee>1000</MembershipFee>
</Member>
<Member level="silver">
<Name>Peter</Name>
<MembershipFee>500</MembershipFee>
</Member>
</Salon>
Merged file
<Salon>
<Member level="platinum">
<Name>Paul</Name>
<MembershipFee>1000</MembershipFee>
</Member>
<Member level="silver">
<Name>James</Name>
<MembershipFee>1000</MembershipFee>
</Member>
<Member level="silver">
<Name>Peter</Name>
<MembershipFee>500</MembershipFee>
</Member>
</FitnessCenter>
The following inserts file 1 into file 2, to create a merged file, but leaving file 1 intact:
const xmlDoc1 = new DOMParser().parseFromString(file1, 'text/xml');
const xmlDoc2 = new DOMParser().parseFromString(file2, 'text/xml');
let sources = xmlDoc1.evaluate("//Member", xmlDoc1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
let destination = xmlDoc2.querySelector("Salon");
for(var i = 0; i < sources.snapshotLength; i++) {
let node = sources.snapshotItem(i);
let n_node = node.cloneNode(true)
destination.append(n_node)
}
alert(destination.outerHTML);
Output:
<Salon>
<Member level="platinum">
<Name>James</Name>
<MembershipFee>1000</MembershipFee>
</Member>
<Member level="silver">
<Name>Peter</Name>
<MembershipFee>500</MembershipFee>
</Member>
<Member level="platinum">
<Name>Paul</Name>
<MembershipFee>1000</MembershipFee>
</Member>
</Salon>
alert(destination.outerHTML)
DOM has the necessary methods. Create a target document for the result, then for each source XML, parse it and fetch the Member
elements. Validate that here is something to copy and append the nodes.
const mergedDocument = document.implementation.createDocument(null, "Salon"); for (const xmlString of getSources()) { const source = (new DOMParser()).parseFromString(xmlString, 'text/xml'); const members = source.querySelectorAll('Salon > Member'); if (members.length > 0) { mergedDocument.documentElement.append(...members); } } console.log((new XMLSerializer()).serializeToString(mergedDocument)); function getSources() { return [ `<Salon> <Member level="platinum"> <Name>Paul</Name> <MembershipFee>1000</MembershipFee> </Member> </Salon>`, `<Salon> <Member level="platinum"> <Name>James</Name> <MembershipFee>1000</MembershipFee> </Member> <Member level="silver"> <Name>Peter</Name> <MembershipFee>500</MembershipFee> </Member> </Salon>` ]; }
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.