2013-06-10 2 views
1

Я читаю XML-файл через SpineTix, который построен на Javascript. Для этого я создал собственный парсер.Чтение XML с помощью Javascript

Это структура XML

<ArlandaExpress> 
<info> 
<updated date="2013-06-10" time="10:28:42"/> 
<message priority="1"> 
<![CDATA[ 
Biljettköp ombord kostar 100:- extra, ticket on board 100 SEK extra 
]]> 
</message> 
<message priority="2"> 
<![CDATA[ 
Biljettköp ombord kostar 100:- extra, ticket on board 100 SEK extra 
]]> 
</message> 
<message priority="3"> 
<![CDATA[ 
Restid 20 min. 2 för 380 kr tor-sön och röda dagar t.o.m.16/6// Traveltime 20 min. 2 for 380 SEK Thu-Sun and bank holidays until 16/6 
]]> 
</message> 
</info> 
    <StockholmC> 
    <next minutes="6"/> 
    <upcoming datetime="2013-06-10 10:50"/> 
    <upcoming datetime="2013-06-10 11:05"/> 
    <upcoming datetime="2013-06-10 11:20"/> 
    </StockholmC> 
</ArlandaExpress> 

Мне нужно захватить минут и DateTime атрибуты в теге StockholmC. Как я могу это сделать? Это мой код до сих пор что, кстати, работает, если вы удалите все другие теги из документа, но StockholmC

function custom_parser(response, records){ 
    var rssDocument = parseXML(response); 
    if (rssDocument==null) return; 
    for (var row=rssDocument.documentElement.firstElementChild; row!=null; row=row.nextElementSibling) { 
     var r = new Object();  
     r.next = row.getAttribute('minutes'); 
     r.date = row.getAttribute('datetime'); 
     records.push(r); 
    } 
} 

Я хочу отметить, что приведенный выше код работает в файле XML только с тегом StockholmC.

Спасибо

+0

Использовать jQuery, потому что API для чтения XML в js отличается в IE и других браузерах - http://api.jquery.com/jQuery.parseXML/ – marko

ответ

1

Как объяснил Феликс, сначала необходимо перебрать детей <StockholmC>. Однако, как упоминалось в вашем вопросе, поскольку вы используете JavaScript внутри SpinetX HMP, вы можете полагаться только на подмножество уровня DOM 3 (см. SVG Micro DOM) и, следовательно, не может использовать getElementsByTagName().

Вот пример итерации DOM, пока вы не найдете правильный элемент.

function custom_parser(response, records){ 
    var rssDocument = parseXML(response); 
    if (rssDocument==null) return; 
    var elem = rssDocument.documentElement.firstElementChild; 
    while (elem!=null) { 
    if (elem.localName=="StockholmC"){ 
     elem = elem.firstElementChild; 
    } else { 
     if (elem.localName=="next") { 
     var r = new Object();  
     r.next = elem.getAttribute('minutes'); 
     records.push(r); 
     } else if (elem.localName=="upcoming") { 
     var r = new Object();  
     r.datetime = elem.getAttribute('datetime'); 
     records.push(r); 
     } 
     elem = elem.nextElementSibling; 
    } 
    } 
} 

Обратите внимание, что пример кода помещает атрибут next и datetime в две разные строки вашего массива.

+0

Это смешно, он отображается только один раз, и он отображает только один предстоящий. Текущий дисплей: Следующий вылет за 7 минут. После 09:30. Что мне нужно: Следующий вылет за 7 минут. После 09:30 10:30 11:30. В настоящее время он, кажется, выталкивает данные по одному и не собирает их перед отображением. – anonamas

2

Вы итерация каждого ребенка корня, начиная с <info> (rssDocument.documentElement.firstElementChild). Эти элементы не имеют атрибутов minutes или datetime.

Если вы хотите перебрать ребенок <StockholmC>, вы должны получить ссылку на него вместо documentElement:

function custom_parser(response, records){ 
    var rssDocument = parseXML(response); 
    if (!rssDocument) return; 
    var stockholmc = rssDocument.getElementsByTagName('StockholmC')[0]; 
    if (!stockholmc) return; 
    for (var row=stockholmc.firstElementChild; row!=null; row = row.nextElementSibling) { 
     // ... 
    } 
} 

интерфейс DOM предоставляет множество методов для обхода дерева DOM. Посмотрите на introduction to DOM on MDN.

+0

TypeError: rssDocument.getElementsByTagName не является функцией: at project: // 02110_Weather_RSS/news_ticker.svg: 170 Он жалуется на эту строку var stockholmc = rssDocument.getElementsByTagName ('StockholmC') [0]; – anonamas

+0

Я смешался с вашим ответом, и я не могу заставить его работать. Теперь он ничего не отображает. Даже пытался клонировать ваш код. – anonamas

+0

Кажется, что код даже не запускает оператор for. – anonamas

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