2

我正在尝试解析实时投注 XML 提要,并且需要从代码中获取每个投注。用简单的英语,我需要为我的基本查询使用标签“EventSelections”,并通过 XML 上的这些标签“循环”,这样我就可以获取所有数据,它会为每个可以在 CMS 上使用的数据创建和实体。

我的问题是我想在树中的两个位置上到祖父节点以收集该信息。每个 EventID 指的是游戏的唯一名称,并且某些游戏的赌注比其他游戏多。我抓住每个赌注和与之关联的 EventID 很重要,问题是,这个 ID 每次都是祖父母。例子:

    <Sportsbet Time="2013-08-03T08:38:01.6859354+09:30">
<Competition CompetitionID="18" CompetitionName="Baseball">
<Round RoundID="2549" RoundName="Major League Baseball">
<Event EventID="849849" EventName="Los Angeles Dodgers (H Ryu) At Chicago Cubs (T Wood)" Venue="" EventDate="2013-08-03T05:35:00" Group="MTCH">
<Market Type="Match Betting - BIR" EachWayPlaces="0">
<EventSelections BetSelectionID="75989549" EventSelectionName="Los Angeles Dodgers">
<Bet Odds="1.00" Line=""/>
</EventSelections>
<EventSelections BetSelectionID="75989551" EventSelectionName="Chicago Cubs">
<Bet Odds="17.00" Line=""/>
</EventSelections>

有谁知道我也可以抓住祖父母标签吗?

目前我正在使用:

//EventSelections (this is the context)
.//@BetSelectionID
.//@EventSelectionName

我已经尝试了几十种不同的方法来做到这一点,包括 ../.. 也不起作用的运算符。对于这方面的任何帮助,我将永远感激不尽。谢谢。

4

2 回答 2

4

我认为你只是在树上走得还不够远。

../*是一个带有缩写的两步位置浴,扩展为parent::node()/child::*... 所以实际上你是在第一步上树,但在第二步后退到树下。

因此,../*给你你的兄弟姐妹(父母的孩子),../../*给你你的阿姨和叔叔(祖父母的孩子),并../../../*给你你的祖父母及其兄弟姐妹(曾祖父母的孩子)。

对于属性,../@*是属性的缩写,parent::node()/attribute::*并且属性附加到元素,它们不被视为子元素。所以你要横着走,而不是在第二步下树。

因此,与上面不同的是,../@*给你父母的属性,同时../../@*给你祖父母的属性。

但是//在您的情况下使用确实不合适。是从一棵树一直走到树叶缩写//。它应该只在极少数情况下使用(当我看到它在 SO 问题上被滥用时,我感到畏缩)。/descendent-or-self::node()/

所以..//..//..//@RoundID可能对你有用,但它实际上是在处理整个树的属性,而不仅仅是你曾祖父母的属性,这就是为什么它要找到你祖父母的属性。 ../../@RoundID应该是获取祖父母属性所需的全部内容。

如果你折磨一个样式表足够长的时间,它最终会为你工作,但它确实更健壮并且可能更快地执行以正确解决问题。

于 2013-08-03T14:56:03.460 回答
2

您可以使用ancestor::Event/@EventID,这正是您所要求的:匹配一个名为的祖先元素Event并返回它的EventID属性。

于 2013-08-03T16:18:35.330 回答