JSFiddle - React, Tailwind, and code Playground
JavaScript
var xml = '\
<people> \
<person first-name="eric" middle-initial="H" last-name="jung"> \
<address street="321 south st" city="denver" state="co" country="usa"/> \
<address street="123 main st" city="arlington" state="ma" country="usa"/> \
</person> \
\
<person first-name="jed" last-name="brown"> \
<address street="321 north st" city="atlanta" state="ga" country="usa"/> \
<address street="123 west st" city="seattle" state="wa" country="usa"/> \
<address street="321 south avenue" city="denver" state="co" country="usa"/> \
</person> \
</people>';
var parser = new DOMParser();
var doc = parser.parseFromString(xml, "text/xml");
// 1. Using Iterators
var personNodes = doc.evaluate("//person", doc, null, XPathResult.ANY_TYPE, null);
var person;
console.log("1. Iterator");
while(person = personNodes.iterateNext()) {
console.log(person);
}
// 2. Using Iterators with a utility function
function evaluateXPath(document, expression) {
var nodes = document.evaluate(expression, document, null, XPathResult.ANY_TYPE, null);
var results = [], node;
while(node = nodes.iterateNext()) {
results.push(node);
}
return results;
}
console.log("2. Iterator with Wrapper");
var addresses = evaluateXPath(doc, "//address");
for(var i = 0; i < addresses.length; i++) {
var address = addresses[i];
console.log(address);
}
// 3. Using Snapshots
var SNAPSHOT = XPathResult.ORDERED_NODE_SNAPSHOT_TYPE;
var secondPersonsAddresses = doc.evaluate("/people/person[2]/address", doc, null, SNAPSHOT, null);
console.log("3. Snapshot");
for(var i = 0; i < secondPersonsAddresses.snapshotLength; i++) {
var address = secondPersonsAddresses.snapshotItem(i);
console.log(address);
}