2013-01-21 57 views
0

解析XML下面是我對工作的XML:PHP:如何使用嵌套的XPath元素

<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:noo="http://www.myscheme.com/schema"> 
    <channel> 
     <item> 
      <title>A Simple Title</title> 
      <noo:subcategory>the sub category</noo:subcategory> 
      <noo:relatedInfos> 
       <noo:teams> 
        <noo:team id="3">New York</noo:team> 
        <noo:team id="4">Las Vegas</noo:team> 
       </noo:teams> 
      </noo:relatedInfos> 
     </item> 
    </channel> 
</rss> 

我這樣做的PHP代碼,以獲得兩個「團隊」,但它不工作($ xml有以前的內容):

$xml_datas = simplexml_load_string($xml); 

foreach($xml_datas->channel->item as $item){      
    $noo = $item->children('noo'); 
    echo $noo->team; 
} 

你知道爲什麼它不起作用嗎?

感謝

+0

可能[使用命名空間解析XML SimpleXML](http://stackoverflow.com/questions/595946/parse-xml-with-namespace-using-simplexml) –

+0

'noo'不是該XML中的元素。這是一個'名字空間'。 –

+0

@MarcB我認爲Userco意識到這一點。 'children()'將一個名稱空間URI作爲它的參數,但這裏的一個問題是'noo'是一個前綴,而不是一個名稱空間URI。 – JLRishe

回答

0

看看這有助於:

<?php // RAY_temp_userco.php 
error_reporting(E_ALL); 

$xml = <<<ENDXML 
<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:noo="http://www.myscheme.com/schema"> 
    <channel> 
     <item> 
      <title>A Simple Title</title> 
      <noo:subcategory>the sub category</noo:subcategory> 
      <noo:relatedInfos> 
       <noo:teams> 
        <noo:team id="3">New York</noo:team> 
        <noo:team id="4">Las Vegas</noo:team> 
       </noo:teams> 
      </noo:relatedInfos> 
     </item> 
    </channel> 
</rss> 
ENDXML; 

$obj = simplexml_load_string($xml); 

$ns = $obj->getNamespaces(TRUE); 

foreach($obj->channel->item as $item){ 
    $noo = $item->children($ns['noo']); 
    var_dump($noo); 
} 
+0

這裏沒有很多解釋你在代碼中改變了什麼以及爲什麼。另外,假設你使用PHP> = 5.2,你不需要在散列中查找命名空間URI,你可以使用' - > children('noo',true)'。無論哪種方式,當然,你依靠的別名將來不會改變。 – IMSoP

+0

好吧,我現在明白了。謝謝。 – Userco

0

「野應」僅僅是該命名空間的本地別名,->children()方法(和大多數的XML處理功能),想知道它的實際的全局標識符,這是xmlns屬性中的URI。

您需要指定名稱空間的完整標識符(即->children('http://www.myscheme.com/schema'))或設置可選的第二個參數以告訴SimpleXML查找前綴(->children('noo', true)。第二個參數可能更易讀,但如果將來會失效文件具有相同的架構,但給人的命名空間不同的本地別名

此外,team節點不直接屬於item節點下,所以你需要遍歷進一步讓他們:

// Give the namespace a readable name that won't change 
define('NS_NOO', 'http://www.myscheme.com/schema'); 

$xml_datas = simplexml_load_string($xml); 

foreach($xml_datas->channel->item as $item){      
    $teams = $item->children(NS_NOO)->relatedInfo->teams; 
    echo $teams->team[0]; 
} 
+0

謝謝,它工作正常。太好了! – Userco

+0

@Userco \t您可以將其中一個答案標記爲「已接受」,以便該問題在網站上顯示爲「已回答」。 :) – IMSoP