2013-08-02 122 views
2

我试图解析一个实时博彩XML源,并需要从代码中获取每个赌注。用简单的英语,我需要使用标记'EventSelections'来查看我的基本查询,并通过XML上的这些标记'循环',这样我就可以获取所有数据,并为每个可以在CMS上使用的数据创建和实体化。XPATH - 无法选择祖父节点

我的问题是我想在树的两个地方去祖父母节点收集信息。每个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> 

有谁知道我怎么能抓住granparent标签以及?

目前我使用:

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

我已经试过几十种不同的方法来做到这一点,包括../ ..运营商将不能工作。我会永远感激这方面的任何帮助。谢谢。

+1

你能举一个例子说明你如何精确使用'..'运算符? –

+2

我想你只是没有走得远远不够树:'../*'给你你的兄弟姐妹,'../../*'给你你的阿姨和叔叔,../../。 ./*'给你你的祖父母。这是因为'..'向上走了一级,但'/'向下走了一级...所以你必须在你再次下去之前比你射击的高一级。 –

+0

这最后工作:..//..//..//@RoundID我使用Drupal 7和XPATH的饲料模块,并已在这个问题上工作了大约15个小时。我真的很感激你把我推向了正确的方向,我很高兴我现在已经解决了!谢谢大家。随时给我发电子邮件给那些坚持使用Drupal和XPATH的人。 –

回答

4

我想你只是没有走得够远。

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

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

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

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

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

所以..//..//..//@RoundID可以为你工作,但它实际上是遍布整个树的属性,而不仅仅是你的曾祖父母的属性,这就是为什么它找到你的祖父母的属性。 ../../@RoundID应该是您需要获取祖父母的属性的所有信息。

如果你折磨一个样式表足够长,它最终会为你工作,但它确实更健壮,可能更快地执行正确的处理事情。

+0

只适用于其他任何新手(如我!)以下是我用来抓取这些数据的EXACT代码。我会看看你的帖子@G。肯·霍尔曼,看看我是否可以调整,如你所说。 语境:// EventSelections // @ CompetitionID // @ CompetitionName ..//..//..//@RoundID ..//..//..//@RoundName .. //..//@EventID ..//..//@EventName ..//..//@Venue ..//..//@EventDate ..//..// @group ..//@Type ..//@EachWayPlaces .//@BetSelectionID .//@EventSelectionName .//@Odds .//@Line .//@BetSelectionID –

2

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