我正在尝试解析实时投注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
我尝试过几十种不同的方法,包括../ ..运算符,它也不起作用。我会永远感激任何帮助。感谢。
答案 0 :(得分:4)
我认为你在树上走得太远了。
../*
是一个带有缩写的两步位置浴,扩展为parent::node()/child::*
...所以实际上你是第一步上升树,但是第二步回到树上步骤
因此,../*
给你的兄弟姐妹(父母的孩子),../../*
给你的阿姨和叔叔(祖父母的孩子),../../../*
给你的祖父母和兄弟姐妹(伟大的) -grandparent的孩子们。)
对于属性,../@*
是parent::node()/attribute::*
的缩写,属性附加到元素,它们不被视为子元素。所以你要走到一边,而不是第二步走到树下。
因此,与上述不同,../@*
为您提供父母的属性,而../../@*
则为您提供祖父母的属性。
但在你的情况下使用//
是不合适的。 //
是/descendent-or-self::node()/
的缩写,它将所有沿着树的方式走向树的叶子。它应该只在极少数情况下使用(当我看到它在SO问题上被滥用时我会感到畏缩)。
所以..//..//..//@RoundID
可能适合你,但它实际上解决了整个树的属性,而不仅仅是你曾祖父母的属性,这就是为什么它找到了祖父母的属性。 <{1}}应该是获得祖父母属性所需的全部内容。
如果你长时间折磨样式表,它最终会对你有用,但它确实更强大,并且可能更快地执行以正确处理事情。
答案 1 :(得分:2)
您可以使用ancestor::Event/@EventID
,这完全符合您的要求:匹配名为Event
的祖先元素并返回其EventID
属性。