将XML文件解析为表

Parse XML file into a table

本文关键字:XML 文件      更新时间:2023-09-26

这是需要解析的XML文件,我们将其称为"servers.XML"。这个文件在我想要解析的同一台服务器上(xml文件在同一个文件夹中)。

<root>
    <list>
        <server>
            <server name="28 Disconnects Later">
                <timestamp name="2015-02-25 14:28:56">low</timestamp>
                <timestamp name="2015-02-25 14:58:56">low</timestamp>
                <timestamp name="2015-02-25 15:28:57">low</timestamp>
                <timestamp name="2015-02-25 15:58:58">low</timestamp>
                <timestamp name="2015-02-25 16:28:59">low</timestamp>
                <timestamp name="2015-02-25 16:59:00">low</timestamp>
                <timestamp name="2015-02-25 17:29:01">low</timestamp>
                <timestamp name="2015-02-25 17:59:02">low</timestamp>
                <timestamp name="2015-02-25 18:29:04">low</timestamp>
                <timestamp name="2015-02-25 18:59:05">low</timestamp>
            </server>
            <server name="Abomination">
                <timestamp name="2015-02-25 14:28:56">high</timestamp>
                <timestamp name="2015-02-25 14:58:56">high</timestamp>
                <timestamp name="2015-02-25 15:28:57">high</timestamp>
                <timestamp name="2015-02-25 15:58:58">high</timestamp>
                <timestamp name="2015-02-25 16:28:59">high</timestamp>
                <timestamp name="2015-02-25 16:59:00">high</timestamp>
                <timestamp name="2015-02-25 17:29:01">high</timestamp>
                <timestamp name="2015-02-25 17:59:02">high</timestamp>
                <timestamp name="2015-02-25 18:29:04">high</timestamp>
                <timestamp name="2015-02-25 18:59:05">high</timestamp>
            </server>
        </server>
    </list>
</root>

我需要把它整理成这样的表格:

|----------------------------------|
| server name                      |
|----------------------------------|
| timestamp name | timestamp value |
| timestamp name | timestamp value |
| timestamp name | timestamp value |
| timestamp name | timestamp value |
| timestamp name | timestamp value |
|----------------------------------|
|                                  |
|----------------------------------|
| server name                      |
|----------------------------------|
| timestamp name | timestamp value |
| timestamp name | timestamp value |
| timestamp name | timestamp value |
| timestamp name | timestamp value |
| timestamp name | timestamp value |

几个小时以来,我一直在研究如何做到这一点,但似乎无法正确显示或根本无法显示内容。

感谢提供的任何帮助

编辑当前代码:

<!DOCTYPE html>
<html>
<head>
    <style>
        table, th, td {
            border: 1px solid black;
            border-collapse:collapse;
        }
        th, td {
            padding: 5px;
        }
    </style>
</head>
<body>
<script>
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.open("GET","AOD-H1Z1.xml",false);
    xmlhttp.send();
    xmlDoc=xmlhttp.responseXML;
    document.write("<table><tr><th colspan='2'>Server</th></tr>");
    var x=xmlDoc.getElementsByTagName("server");
    for (i=0;i<x.length;i++)
    {
        document.write("<tr><td>");
        document.write(x[i].getElementsByTagName("timestamp")[0].childNodes[0].nodeValue);
        document.write("</td><td>");
        document.write(x[i].getElementsByTagName("timestamp")[0].childNodes[0].nodeValue);
        document.write("</td></tr>");
    }
    document.write("</table>");
</script>
</body>
</html>

首先,我注意到<server>节点嵌套在其他<server>节点中。优选的语法是删除这些包装节点,或将其重命名为<servers>,例如(这是我在下面的代码中假设的)

编辑:由于已经从Ajax请求解析了xml,因此可以跳过xmlString, xmlDoc和解析部分。

你可以这样解析:

var xmlString = '<root><list><server><server name="28 Disconnects Later"><timestamp name="2015-02-25 14:28:56">low</timestamp><timestamp name="2015-02-25 14:58:56">low</timestamp><timestamp name="2015-02-25 15:28:57">low</timestamp><timestamp name="2015-02-25 15:58:58">low</timestamp><timestamp name="2015-02-25 16:28:59">low</timestamp><timestamp name="2015-02-25 16:59:00">low</timestamp><timestamp name="2015-02-25 17:29:01">low</timestamp><timestamp name="2015-02-25 17:59:02">low</timestamp><timestamp name="2015-02-25 18:29:04">low</timestamp><timestamp name="2015-02-25 18:59:05">low</timestamp></server><server name="Abomination"><timestamp name="2015-02-25 14:28:56">high</timestamp><timestamp name="2015-02-25 14:58:56">high</timestamp><timestamp name="2015-02-25 15:28:57">high</timestamp><timestamp name="2015-02-25 15:58:58">high</timestamp><timestamp name="2015-02-25 16:28:59">high</timestamp><timestamp name="2015-02-25 16:59:00">high</timestamp><timestamp name="2015-02-25 17:29:01">high</timestamp><timestamp name="2015-02-25 17:59:02">high</timestamp><timestamp name="2015-02-25 18:29:04">high</timestamp><timestamp name="2015-02-25 18:59:05">high</timestamp></server></server></list></root>',
    xmlDoc,
    // Create your table element
    table = document.createElement('table');
// Parse the xml
if (window.DOMParser){ // Standard browsers
    var parser = new DOMParser();
    xmlDoc = parser.parseFromString(xmlString, "text/xml");
}
else { // Internet Explorer
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = false;
    xmlDoc.loadXML(xmlString); 
}
var servers = xmlDoc.getElementsByTagName('list')[0].childNodes[0]
.getElementsByTagName('server');
// for each server
for(var i=0, l=servers.length; i<l; i++){
    var server = servers[i];
    // Insert a row
    var tr = table.insertRow();
    // Insert a cell
    var td = tr.insertCell();
    // Make it spread over 2 columns
    td.colSpan = '2';
    // Insert the server name
    td.innerHTML = server.getAttribute('name');
    var timestamps = server.getElementsByTagName('timestamp');
    // For each timestamp
    for(var j=0, k=timestamps.length; j<k; j++){
        var timestamp = timestamps[j];
        // Insert a row
        tr = table.insertRow();
        // Insert a cell
        td = tr.insertCell();
        // Insert the timestamp name
        td.innerHTML = timestamp.getAttribute('name');
        // Insert a cell
        td = tr.insertCell();
        // Insert the timestamp value
        td.innerHTML = timestamp.innerHTML;
    }
}
// Append it to the body?
document.body.appendChild(table);
* {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
table {
  margin: 1em auto;
  border: 1px solid black;
  border-collapse: collapse;
  font-family: Arial, Helvetica, sans-serif;
}
td {
  padding: .5em .8em;
  border: 1px solid #000;
  text-align: center;
}
td[colspan='2'] {
  background: #333;
  color: #fff;
}

JS Fiddle演示