如何使用 JavaScript 遍历 XML 节点和子节点

How to loop through XML nodes and child nodes using JavaScript?

本文关键字:节点 子节点 XML 遍历 何使用 JavaScript      更新时间:2023-09-26

我目前在循环遍历 XML 节点并显示其子元素时遇到问题。

下面是 XML 的外观:

<?xml version="1.0" encoding="UTF-8"?>
<monday>
    <employee>
        <name>Employee 1</name>
        <startTime>12 PM</startTime>
        <endTime>3:30 PM</endTime>
        <skills>Web Development, Graphic Design</skills>
        <programs>Sublime Text</programs>
    </employee>
    <employee>
        <name>Employee 2</name>
        <startTime>10 AM</startTime>
        <endTime>2 PM</endTime>
        <skills>Graphic Design</skills>
        <programs>Illustrator, Photoshop</programs>
    </employee>
    <employee>
        <name>Employee 3</name>
        <startTime>12:30 PM</startTime>
        <endTime>3:30 PM</endTime>
        <skills>Social Media</skills>
        <programs>Facebook, Twitter, Instagram</programs>
    </employee>
</monday>

我的目标是算法是:

  1. 在根元素 ( monday 中 ),进入第一个子元素 ( employee
  2. 循环遍历employee的每个子元素(namestartTimeendTimeskillsprograms
  3. 对于每个子元素,将文本写入 HTML 文档
  4. 对每个employee元素重复步骤 2 和 3,直到迭代到达 lastChild 元素

到目前为止,我只能迭代并编写每个员工的一个元素。下面是 name 元素的代码:

// loads XML file
if (window.XMLHttpRequest) {
  xhttp = new XMLHttpRequest();
} else { // for IE 5/6
  xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.open("GET","assets/" + today + ".xml",false);
xhttp.send();
xmlDoc = xhttp.responseXML;
document.write("XML document loaded into an XML DOM Object." + "<br><br>"); // confirms XML file is loaded

// iterates through employees and displays their information
x = xmlDoc.getElementsByTagName("name");
for (i = 0; i < x.length; i++) {                  // line 1
    document.write(x[i].childNodes[0].nodeValue);
    document.write("<br>");
}

输出:

Employee 1
Employee 2
Employee 3

我尝试在 // line 1 中嵌套另一个 for 循环,但这会导致输出中不显示任何内容。

我正确输出的目标是:

Employee 1
Start Time: 12 PM
End Time: 3:30 PM
Skills: Web Development, Graphic Design
Programs: Sublime Text, Dreamweaver
Employee 2
Start Time: 11 AM
End Time: 32 PM
Skills: Graphic Design
Programs: Illustrator, Photoshop
Employee 3
Start Time: 12:30 PM
End Time: 3:30 PM
Skills: Social Media
Programs: Facebook, Twitter, Instagram

如果您有任何问题,我会尽我所能回答!

提前谢谢你!

循环的根附加到employee而不是name上对于嵌套循环会更好(这是此解决方案将使用的):

var employees = xmlDoc.getElementsByTagName("employee"); //outputs array of employees
for (employeeIndex = 0; employeeIndex  < employees.length; employeeIndex++) {
    var empDetails = employees[employeeIndex].children; //outputs array of details
    for (detailIndex = 0; detailIndex < empDetails.length; detailIndex++) {
        document.write(employees[employeeIndex].childNodes[detailIndex].nodeValue);
    }
    document.write("<br>");
}

我还注意到每employee组节点的容器是一周中的一天。如果要遍历一周中的每一天,则可以在employeeIndex之外创建另一个嵌套以循环遍历各种dayIndex