【问题标题】:Reading XML with Javascript用 Javascript 读取 XML
【发布时间】:2013-06-10 08:33:21
【问题描述】:

我正在通过基于 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 文件中工作。

谢谢

【问题讨论】:

标签: javascript xml parsing


【解决方案1】:

您正在遍历根的每个子节点,从 &lt;info&gt; (rssDocument.documentElement.firstElementChild) 开始。这些元素没有minutesdatetime 属性。

如果你只想遍历&lt;StockholmC&gt; 的孩子,你必须得到它的引用而不是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

【讨论】:

  • TypeError: rssDocument.getElementsByTagName is not a function: at project://02110_Weather_RSS/news_ticker.svg:170 它在这一行抱怨 var stockholmc = rssDocument.getElementsByTagName('StockholmC')[0];
  • 我一直在混合你的答案,但我无法让它发挥作用。现在它什么都没有显示。甚至试图克隆你的代码。
  • rssDocument.documentElement.getElementsByTagName 呢?
【解决方案2】:

正如 Felix 所解释的,您首先需要遍历 的子级。但是,正如您在问题中提到的,当您在 SpnetX 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 属性放在数组的两个不同行中。

【讨论】:

  • 这很有趣,它只显示下一个,它只显示一个即将到来的。当前显示:7 分钟后的下一班次。 09:30 之后。我需要什么: 7 分钟后出发。以下 09:30 10:30 11:30。目前它似乎一次推出一个数据,而不是在显示之前收集它们。
猜你喜欢
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多