2014-10-17 3 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» как атрибут, элемент «lastname», элемент «firstname» и элемент «курсы», который содержит все курсы (каждый из которых представлен элемент «курс». Учащийся «курса» также имеет уникальную идентификацию, которая либо представляет собой один курс (пример выше: MB111, MB112), либо модуль (пример выше: MB100, MB110). этот «курс» содержит элемент «grade», который может быть двух типов - «простой» и «сложный». Доступны множественные попытки, и каждая попытка оценивается с оценкой (пример выше: для 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!!! 
+----------------------------------------------------------------------+ 

Использование Iceweasel (в Firefox в Debian) отладчик я заметил, что переменная х имеет 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>" 

Кроме того, я должен упомянуть, что я использую Oxygen XML Editor, который до сих пор оказались очень глючный (для работы с XSD, DTD и XSLT неупомянуть о его почти несуществующей поддержке для редактирования JavaScript), но я более или менее вынужден использовать его. Проблема, хотя выглядит более тесно связана с тем, что я лично написал.

+4

Параметр '.getElementsByTagName()' функция просто берет 1 аргумент. – Pointy

+0

Вы правы. Когда я удалил его, хотя ничего не получил. Отладчик говорит, что x имеет длину = 0.: -/ – rbaleksandar

+1

Hm, ' 5.0' * * * не корректно сформирован (отсутствуют кавычки вокруг 'type' значение атрибута). – Bergi

ответ

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

+0

Любые сообщения сейчас в консоли? –

+0

Да, после внесения некоторых изменений кажется, что мой XML не очень хорошо сформирован. В консоли отображается сообщение «не правильно сформированное», связанное с моим файлом university.xml. Я проверю его и посмотрю, где проблема. Кислородный XML, кажется, дает мне некоторые очень запутывающие сообщения об ошибках, касающиеся моего XML-файла, в частности о «курсе» и «циде». С одной стороны, это говорит о том, что «Attribute» {myNS: university} cid должен появиться на «курсе» элемента », но с другой стороны он говорит:« Атрибут «cid» не может появляться в элементе «course» «??? – rbaleksandar

Смежные вопросы