2010-04-07 77 views
2

返回「假」我有一個XML片段作爲這樣:XPath查詢SimpleXML中

<meta_tree type="root"> 
    <meta_data> 
     <meta_cat>Content Provider</meta_cat> 
     <data>Mammoth</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Genre</meta_cat> 
     <data>Games</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Channel Name</meta_cat> 
     <data>Games Trailers</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Collection</meta_cat> 
     <data>Strategy</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Custom 1</meta_cat> 
     <data>PC</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>DRM Protected</meta_cat> 
     <data>N</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Aspect Ratio</meta_cat> 
     <data>16:9</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Streaming Type</meta_cat> 
     <data>VOD</data> 
    </meta_data> 
</meta_tree> 

我從$meta_tree->asXML()摘錄囊括。

所以鑑於這種情況,我需要爲每個元素的XPath查詢,所以我使用:

$meta_tree->xpath("/meta_data[meta_cat='Content Provider']"); 

但這返回false。

我曾嘗試:

  • /meta_tree/meta_data[meta_cat='Content Provider']
  • //meta_data[meta_cat='Content Provider']
  • meta_data[meta_cat='Content Provider'](這個返回一個數組,但數組爲空)

我已經使用AquaPath,驗證我的查詢,所以我不知道我做錯了什麼。

任何人有任何想法?

DJS。

編輯:根據Tolomak的建議,這裏有一些更多的信息。

該元件是一個較大的文檔的片段,如下(名字已被替換爲***保護無辜):

<contents total_items="1" xmlns="http://rxml.***.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://rxml.***.com/xsd/*Ingestion.xsd "> 
    <content item_id="451195"> 
     ... 
     <meta_tree type="root"> 
      ... see snippet above ... 
     </meta_tree> 
    </content> 
</contents> 

我檢索上述片段由:

$dom = new SimpleXMLElement(... xml_string ...); 
foreach($dom->content as $content) 
{ 
    $contentMetadata = $this->getMetadata($content->meta_tree) 
} 

public function getMetadata($meta_tree) 
{ 
    echo $meta_tree->asXML(); 
} 

答案:問題是默認的命名空間。我選擇將它們去掉而不是處理名稱空間,除非有人知道如何在SimpleXMLElement中註冊xmlns默認名稱空間。

+0

可能相關:您使用的是PHP和libxml的版本? (一個[phpinfo](http://php.net/phpinfo)()頁面會告訴你) – salathe 2010-04-07 08:37:01

+0

這是否可以省略你的XML在命名空間中的微小但相關的事實? – Tomalak 2010-04-07 11:39:31

+0

@salathe libxml:2.7.3,PHP 5.2.9-2(Win) – Drew 2010-04-07 23:26:50

回答

0

問題是默認的命名空間。我選擇將它們去掉而不是處理名稱空間,除非有人知道如何在SimpleXMLElement中註冊xmlns默認名稱空間。

0

嘗試

$meta_tree->xpath("meta_data[meta_cat='Content Provider']") 

例如

<?php 
$meta_tree = new SimpleXMLElement(getData()); 
$foo = $meta_tree->xpath("meta_data[meta_cat='Content Provider']"); 
var_dump($foo); 

function getData() { 
    return '<meta_tree type="root"> 
    <meta_data> 
     <meta_cat>Content Provider</meta_cat> 
     <data>Mammoth</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Genre</meta_cat> 
     <data>Games</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Channel Name</meta_cat> 
     <data>Games Trailers</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Collection</meta_cat> 
     <data>Strategy</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Custom 1</meta_cat> 
     <data>PC</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>DRM Protected</meta_cat> 
     <data>N</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Aspect Ratio</meta_cat> 
     <data>16:9</data> 
    </meta_data> 
    <meta_data> 
     <meta_cat>Streaming Type</meta_cat> 
     <data>VOD</data> 
    </meta_data> 
    </meta_tree>'; 
} 

打印

array(1) { 
    [0]=> 
    object(SimpleXMLElement)#2 (2) { 
    ["meta_cat"]=> 
    string(16) "Content Provider" 
    ["data"]=> 
    string(7) "Mammoth" 
    } 
} 
+0

當我運行這個,我得到一個數組,但是當我運行count(...)時它是空的; – Drew 2010-04-07 07:28:28

+0

hm,適合我... – VolkerK 2010-04-07 08:16:44