我有一个xml片段:
<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();
}
ANSWER:问题是默认命名空间。我选择剥离它们而不是处理命名空间,除非有人知道如何在SimpleXMLElement中注册xmlns默认命名空间。
答案 0 :(得分:0)
试
$meta_tree->xpath("meta_data[meta_cat='Content Provider']")
e.g。
<?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"
}
}
答案 1 :(得分:0)
问题是默认命名空间。我选择剥离它们而不是处理命名空间,除非有人知道如何在SimpleXMLElement中注册xmlns默认命名空间。