2013-08-21 187 views
0

我正在使用Xpath解析一些XML文件。我想用一個表達式來選擇一個特定的分類節點和他的父節點(Sport)?!PHP XPath - 用一條規則選擇一個特定節點及其父節點

XML文檔:livescore_full.xml

<? xml version = "1.0" encoding = "UTF-8" ?> 
<LivescoreData generatedAt="2013-08-18T09:41:19 CEST" type="full"> 
    <Sport SportId="1"> 
     <Name language="en">Soccer</Name> 
     <Category CategoryId="48"> 
      <Name language="en">Argentina</Name> 
      <Tournament TournamentId="68" UniqueTournamentId="155"> 
       <Name language="en">Primera Division, Torneo Inicial</Name> 
      </Tournament> 
     </Category> 
     <Category CategoryId="49"> 
      <Name language="en">Brazil</Name> 
      <Tournament TournamentId="69" UniqueTournamentId="156"> 
       <Name language="en">Brazil Primera Division</Name> 
      </Tournament> 
     </Category> 
    </Sport> 
    <Sport SportId="2"> 
     <Name language="en">Basketball</Name> 
     <Category CategoryId="55"> 
      <Name language="en">Spain</Name> 
      <Tournament TournamentId="545" UniqueTournamentId="453"> 
       <Name language="en">Primera Division, Torneo Inicial</Name> 
      </Tournament> 
     </Category> 
     <Category CategoryId="56"> 
      <Name language="en">England</Name> 
      <Tournament TournamentId="654" UniqueTournamentId="5656"> 
       <Name language="en">England</Name> 
      </Tournament> 
     </Category> 
    </Sport> 
</LivescoreData> 


$xml = simplexml_load_file("livescore_full.xml"); 
$data = $xml->xpath('//Category[@CategoryId="48"]'); 
print_r($data); // only return data for specific Category node 

$數據包含有關類別節點ID = 48的數據,但沒有對這項運動的ID和體育名稱信息。

如何編寫Xpath規則以使用CategoryId屬性選擇運動和類別數據?我嘗試了一些祖先或自我的變化,但沒有成功。

回答

0
"/LiveScoreData/Sport[Category[@CategoryId='48']" 

會是一種方式。

+0

隨着「/ LiveScoreData/Sport [Category [@ CategoryId = '48']]」返回空數組。使用「// Sport [Category [@IetId = '48']]」返回運動節點,並且兩個類別節點(48 i 49)都被返回,但僅需要類別48。 並感謝您的及時答覆。 – HeyHo

+1

Xpath選擇節點,它不處理它們。一旦你有了它,你可以刪除那些你不想要的ID –

0
該想到

一個簡單的答案是(How do I select multiple nodesets):

$data = $xml->xpath('//Category[@CategoryId="48"] | //Sport[Category[@CategoryId="48"]]'); 

但是,我就把你的SimpleXML對於這種情況,併爲此:

$dom = new DOMDocument(); 
$dom->load("livescore_full.xml"); 
$xpath = new DOMXPath($dom); 
$category = $xpath->query('//Category[@CategoryId="48"]')->item(0); 
//then sport is just it's parentNode: 
$sport = $category->parentNode; 

//removing all other cats: 
$dom = new DOMDocument(); 
$dom->load("livescore_full.xml"); 
$xpath = new DOMXPath($dom); 

$categories = $xpath->query('//Sport[Category[@CategoryId="48"]]/Category[@CategoryId!="48"]'); 
while($othercat = $categories->item(0)){ 
    $othercat->parentNode->removeChild($othercat); 
} 
+0

選擇多個節點不是我要找的解決方案。 我試圖讓導致這樣的(在結構對象的數組): '<體育SportId = 「1」> <名稱語言= 「EN」>足球 <類別類別ID = 「48」 > <名稱語言= 「EN」>阿根廷 <錦標賽TournamentId = 「68」 UniqueTournamentId = 「155」> <名稱語言= 「EN」>西甲,TORNEO Inicial ' 謝謝您的回答。 – HeyHo

+0

所以,用文字_「我想選擇一個特定的類別節點和他的父節點(運動)用一個表達式」_你的意思是_「我想要一個體育節點只有一個類別」_...這是一個完全不同的東西。來吧... – Wrikken

+0

是的,那是真的,對不起。但是我不知道SportId,選擇節點時只有CategoryId。 – HeyHo

相關問題