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);
}