简体   繁体   中英

Merge two XML files into one in Javascript

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM