2017-02-02 73 views
0

鑑於XML和相關的PHP,下面如何以與獲得非名稱空間值相同的方式獲得名稱空間值?我一直在談論關於此的其他一些SE QA,但似乎無法做到。感謝您的幫助。 :)如何從名稱空間和非名稱空間XML的混合中獲取值

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" xmlns:psg="http://b3000.example.net:3000/psg_namespace/"> 
    <channel> 
    <title>Example</title> 
    <description>example stuff</description> 
    <item> 
     <psg:eventId>406589</psg:eventId> 
     <psg:duration>3482</psg:duration> 
    </item> 
    </channel> 
</rss> 

$xml = new SimpleXMLElement($source, null, true); 
foreach($xml->channel->item as $entry){ 
    echo $entry->title;   // This works 
    echo $entry->description; // This works 
    echo $entry->item->duration // Pseudo of what I need 
} 

如何獲得持續時間?我與變化的嘗試,如這已經失敗

$namespaces = $item->getNameSpaces(true); 
$psg = $item->children($namespaces['psg']); 

更新

雖然這不是我實際上是尋找答案,我必須接受這讓我想的東西,導致第一個答案實際的問題 - 「操作員錯誤」!這樣做的工作....我的問題是在試圖找出它,我正在調試echo print_r($psg, true)。這顯示了SimpleXmlObject的結果,然後讓我追逐如何獲得這些屬性 - 我所要做的就是分配屬性而不是回顯它。實現這一

foreach($xml->channel->item as $entry){ 
    $psg = $item->children($ns['psg']); 
    $title = (string) $item->title; 
    $duration = (string) $psg->duration; 
} 
+0

您是否嘗試過使用從http://php.net/manual/en/simplexmlelement.children.php方法'children',你在命名空間中通過,並告訴它這是一個前綴,以得到那個節點? – Andy

+0

嗨!這個網站的慣例是問題和答案是分開的,[即使這意味着回答你自己的問題](http://stackoverflow.com/help/self-answer)。因此,您添加的「更新」應該是一個答案,然後您可以接受,向未來的讀者展示這是解決問題的方法。你可以對羅比Averill的回答表示讚賞。 – IMSoP

回答

0

一種方法是使用XPath with namespaces組合:

$xml = new SimpleXMLElement($source, null, true); 
$xml->registerXPathNamespace('psg', 'http://b3000.example.net:3000/psg_namespace/'); 

foreach ($xml->xpath('//item/psg:duration') as $duration) { 
    echo $duration, PHP_EOL; 
} 

如果你不想字面上聲明命名空間,您可以從文檔中檢索它,並將其添加/他們動態:

foreach ($xml->getDocNamespaces() as $key => $namespace) { 
    $xml->registerXPathNamespace($key, $namespace); 
}