我正在通过基于Javascript构建的SpineTix读取XML文件。我为此创建了一个自定义解析器。
这是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>
我需要获取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 );
}
}
我想指出上面的代码只能在一个只包含StockholmC标记的XML文件中使用。
谢谢
答案 0 :(得分: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。
答案 1 :(得分:1)
正如Felix所解释的,你首先需要迭代&lt; StockholmC&gt;的孩子们。但是,正如您在问题中所提到的,当您在SpinetX HMP中使用JavaScript时,您只能依赖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属性放在数组的两个不同行中。