2014-10-17 88 views
-1

對於HTML,JavaScript和XML(在前兩個方面)我很新,所以記住這一點。我有下面的XML文檔:document.getElementsByTagName()返回錯誤的元素

<?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> 

我會盡力解釋的結構是什麼儘可能短:頂部元素是「大學」,它包含一個孩子的「學生」。另一方面,「學生」可以包含多個「學生」元素,每個元素具有獨特的學生標識「sid」作爲屬性,「姓氏」元素,「名字」元素和包含所有課程的元素「課程」 「course」元素是「學生參加的」,「course」元素也有一個唯一的標識,它可以代表單個課程(上例:MB111,MB112)或模塊(上例:MB100,MB110)。 「課程」包含的是「成績」元素,可以是「簡單」和「複雜」兩種類型。多次嘗試可用,每次嘗試都會評分(如上例:對於MB100,我們有兩次嘗試)。簡單等級用於由單一課程組成的模塊(上例:MB100),另一方面複雜等級是每個課程的所有簡單等級的算術平均值,一個模塊包含所有嘗試的最高等級單個課程(上面的例子:MB110有一個等級= 2.0,它是1.0和3.0的算術平均值,對於每個課程而言,其中3.0代表MB112課程中成績最高的課程)。

這就是說我想創建一個HTML頁面並使用JavaScript爲其中的所有學生生成一個表格。目前,我正在嘗試顯示每個「學生」元素的「sid」屬性以及他/她的名字和姓氏。我的頁面源代碼如下:

<!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!!! 
+----------------------------------------------------------------------+ 

(在Debian Firefox)的調試器使用Iceweasel的我已經注意到,X變量有2個這兩個孩子給一個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>" 

我也不得不提,我使用氧XML編輯器,它至今已被證明是非常錯誤(與XSD,DTD工作和XSLT不提到它幾乎不存在對JavaScript編輯的支持),但我或多或少地被迫使用它。雖然這個問題看起來與我親自寫的東西更相關。

+4

的'.getElementsByTagName()'函數只需要1個參數。 – Pointy 2014-10-17 14:24:35

+0

你說得對。雖然我什麼也沒有得到,但當我將它移開時。調試器表示x的長度爲0.: -/ – rbaleksandar 2014-10-17 14:27:45

+1

Hm,' 5.0 * *格式不正確(缺少「type」屬性的值)。 – Bergi 2014-10-17 14:27:55

回答

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> 
+0

我按照@Pointy的建議在我的原始文檔中更改了此項。在我的問題下面看到我的評論。 – rbaleksandar 2014-10-17 14:34:36

+0

現在在控制檯中的任何消息? – 2014-10-17 14:35:15

+0

是的,在做了一些修改之後,似乎我的XML格式不正確。在控制檯中顯示鏈接到我的university.xml文件的消息「格式不正確」。我會檢查它,看看問題出現在哪裏。氧XML似乎給我一些關於我的XML文件的特別關於「課程」和「cid」的非常混淆的錯誤消息。一方面它說「屬性'{myNS:university} cid'必須出現在元素'course''上,但另一方面它說'屬性'cid'不允許出現在元素'course'中」??? – rbaleksandar 2014-10-17 14:43:44