2013-08-02 166 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屬性。