document.getElementsByTagName()返回错误的元素

时间:2014-10-17 14:22:49

标签: javascript html xml html-table getelementsbytagname

我对HTML,JavaScript和XML(在前两个版本的上下文中)都很陌生,所以请记住这一点。我有以下XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<university
    xmlns="myNS:university"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="myNS university.xsd">
    <students>
        <student sid="jdoe12345>
            <lastname>Doe</lastname>
            <firstname>John</lastname>
            <courses>
                <course cid="MB100">
                    <grade attempt="1" term="W10" type="simple">5.0</grade>
                    <grade attempt="2" term="S11" type="simple">2.3</grade>
                </course>
                <course cid="MB110">
                    <grade attempt="1" term="S11" type="complex">2.0</grade>
                    <course cid="MB111">
                        <grade attempt="1" term="S11" type="simple">1.0</grade>
                    </course>
                    <course cid="MB112">
                        <grade attempt="1" term="S11" type="simple">5.0</grade>
                        <grade attempt="2" term="S11" type="simple">3.0</grade>
                    </course>
                </course>
                ...
            </courses>
        </student>
        ...
    </students>
</university>

我会尝试解释结构尽可能短:最重要的元素是&#34;大学&#34;它包含一个孩子&#34;学生&#34;。 &#34;学生&#34;另一方面,可以包含多个&#34;学生&#34;元素,每个都有一个独特的学生识别&#34; sid&#34;作为属性,&#34;姓氏&#34;元素,&#34;名字&#34;元素和元素&#34;课程&#34;其中包含所有课程(每个课程由&#34;课程&#34;元素&#34;学生参加过课程.A&#34;课程&#34;元素也有一个唯一的标识,代表一门课程(例如上面:MB111,MB112)或模块(例如上面的例子:MB100,MB110)。&#34; course&#34;包含的另一个元素是&#34; grade&#34;元素,它可以是两种类型 - &# 34;简单&#34;和&#34;复杂&#34;。可以进行多次尝试,并且每次尝试都使用等级进行评估(例如上面:对于MB100,我们有两次尝试)。简单等级用于包含等级的模块。单个课程(例如上面:MB100)。另一方面,复杂等级是每个课程的所有简单等级的算术平均值,一个模块包括单个课程的所有尝试的最高等级(例如上面:MB110有等级= 2.0,这是每个课程的算术平均值1.0和3.0,其中3.0是最高等级的尝试e course MB112)。

那就是说我想创建一个HTML页面并使用JavaScript生成一个表,其中包含所有学生。目前我正试图展示&#34; sid&#34;每个学生的属性&#34;元素加上他/她的名字和姓氏。我的页面源代码如下所示:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>My pretty page</title>
        <link rel="stylesheet" type="text/css" href="my_stylesheet.css"/>
    </head>
    <body>
        <script type="text/javascript">
            xmlhttp = new XMLHttpRequest();
            xmlhttp.open("GET","/home/USERNAME/xmlplayground/university.xml",false);
            xmlhttp.send();
            xmlDoc = xmlhttp.responseXML;
            document.write("<table border='1'>");
            var x = xmlDoc.getElementsByTagName("*","student");
            for(i = 0; i < x.length; i++) {
                document.write("<tr><td>");
                document.write(x[i].getAttribute("sid"));
                document.write("</td><td>");
                document.write(x[i].getElementsByTagName("*","lastname")[0].childNodes[0].nodeValue);
                document.write("</td><td>");
                document.write(x[i].getElementsByTagName("*","firstname")[0].childNodes[0].nodeValue);
                document.write("</td></tr>");
            }
            document.write("</table>");
        </script>
    </body>
</html>

出于某种原因,我得到了一个非常奇怪的输出:

+--------------------------------------------------------------------------------------------------------------------------------------+
| null | 5.0 --------------------------------------------------------^ | 5.0 --------------------------------------------------------^ |
+--------------------------------------------------------------------------------------------------------------------------------------+
| null |                 EMPTY CELL HERE!!!                            |                      NO CELL HERE!!!
+----------------------------------------------------------------------+

使用Iceweasel(Debian中的Firefox)调试器我注意到x变量有两个孩子,它们都给出了InnerHTML错误:

"XML Parsing Error: not well-formed
Location: file:///home/USERNAME/xmlplayground/university.xml
Line Number 12, Column 57:
<sourcetext xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">
                    &lt;grade attempt="1" term="WS10" type=simple&gt;5.0&lt;/grade&gt;--------------------------------------------------------^
</sourcetext>"

此外,我必须提到我使用的是Oxygen XML Editor,到目前为止,它已被证明是非常错误的(对于使用XSD,DTD和XSLT而言,更不用说它几乎不存在对JavaScript编辑的支持)但我或多或少被迫使用它。这个问题虽然看起来与我亲自编写的内容有关。

1 个答案:

答案 0 :(得分:1)

哈哈,您已将firstname代码标记错误,应使用</firstname>代替</lastname>关闭代码。 :P

应用此JS:

xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "/home/USERNAME/xmlplayground/university.xml", false);
xmlhttp.send();
xmlDoc = xmlhttp.responseXML;
document.write("<table border='1'>");
var x = xmlDoc.getElementsByTagName("student");
for (var i = 0; i < x.length; i++) {
    document.write("<tr><td>");
    document.write(x[i].getAttribute("sid"));
    document.write("</td><td>");
    document.write(x[i].getElementsByTagName("lastname")[0].childNodes[0].nodeValue);
    document.write("</td><td>");
    document.write(x[i].getElementsByTagName("firstname")[0].childNodes[0].nodeValue);
    document.write("</td></tr>");
}
document.write("</table>");

这是你的固定XML:

<?xml version="1.0" encoding="UTF-8"?>
<university
    xmlns="myNS:university"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="myNS university.xsd">
    <students>
        <student sid="jdoe12345">
            <lastname>Doe</lastname>
            <firstname>John</firstname>
            <courses>
                <course cid="MB100">
                    <grade attempt="1" term="W10" type="simple">5.0</grade>
                    <grade attempt="2" term="S11" type="simple">2.3</grade>
                </course>
                <course cid="MB110">
                    <grade attempt="1" term="S11" type="complex">2.0</grade>
                    <course cid="MB111">
                        <grade attempt="1" term="S11" type="simple">1.0</grade>
                    </course>
                    <course cid="MB112">
                        <grade attempt="1" term="S11" type="simple">5.0</grade>
                        <grade attempt="2" term="S11" type="simple">3.0</grade>
                    </course>
                </course>
            </courses>
        </student>
    </students>
</university>