Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Javascript读取XML_Javascript_Xml_Parsing - Fatal编程技术网

用Javascript读取XML

用Javascript读取XML,javascript,xml,parsing,Javascript,Xml,Parsing,我正在通过SpineTix读取一个XML文件,SpineTix是基于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

我正在通过SpineTix读取一个XML文件,SpineTix是基于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>
我想指出,上面的代码在一个只有StockholmC标记的XML文件中工作


谢谢

您正在迭代根的每个子级,从
开始(
rssDocument.documentElement.firstElementChild
)。这些元素没有
minutes
datetime
属性

如果您只想迭代
的子元素,则必须获得对它的引用,而不是
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树。看看。

正如Felix所解释的,您首先需要迭代的子对象。但是,正如您在问题中提到的,当您在SpinetX HMP中使用JavaScript时,您只能依赖DOM级别3的子集(请参阅),因此不能使用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属性放在数组的两个不同行中。

使用jQuery是因为IE中读取js中XML的API与其他浏览器不同-TypeError:rssDocument.getElementsByTagName不是函数:atproject://02110_Weather_RSS/news_ticker.svg:170 它在该行var stockholmc=rssDocument.getElementsByTagName('StockholmC')[0];我一直在混淆你的答案,我无法让它发挥作用。现在它什么也不显示了。甚至试图克隆您的代码。
rssDocument.documentElement.getElementsByTagName
?这很有趣,它只显示下一次,而且只显示一次。当前显示:7分钟后下一次起飞。接下来是09:30。我需要的是:7分钟后下一班飞机。以下是09:30 10:30 11:30。目前,它似乎一次推出一个数据,而不是在显示之前收集它们。
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;
    }
  }
}