XPATH - 无法选择祖父节点

时间:2013-08-02 23:56:19

标签: xpath

我正在尝试解析实时投注XML Feed并需要从代码中获取每个投注。用简单的英语我需要使用标签'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

我尝试过几十种不同的方法,包括../ ..运算符,它也不起作用。我会永远感激任何帮助。感谢。

2 个答案:

答案 0 :(得分:4)

我认为你在树上走得太远了。

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

因此,../*给你的兄弟姐妹(父母的孩子),../../*给你的阿姨和叔叔(祖父母的孩子),../../../*给你的祖父母和兄弟姐妹(伟大的) -grandparent的孩子们。)

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

因此,与上述不同,../@*为您提供父母的属性,而../../@*则为您提供祖父母的属性。

但在你的情况下使用//是不合适的。 ///descendent-or-self::node()/的缩写,它将所有沿着树的方式走向树的叶子。它应该只在极少数情况下使用(当我看到它在SO问题上被滥用时我会感到畏缩)。

所以..//..//..//@RoundID可能适合你,但它实际上解决了整个树的属性,而不仅仅是你曾祖父母的属性,这就是为什么它找到了祖父母的属性。 <{1}}应该是获得祖父母属性所需的全部内容。

如果你长时间折磨样式表,它最终会对你有用,但它确实更强大,并且可能更快地执行以正确处理事情。

答案 1 :(得分:2)

您可以使用ancestor::Event/@EventID,这完全符合您的要求:匹配名为Event的祖先元素并返回其EventID属性。