我有一个这样的 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='内容提供商']
//meta_data[meta_cat='内容提供商']
meta_data[meta_cat='Content Provider']
(这会返回一个数组,但该数组为空)
我一直在使用AquaPath ,它验证了我的查询,所以我不确定我做错了什么。
有人有什么想法吗?
DJ。
编辑:根据 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 默认命名空间。
最佳答案
尝试
$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"
}
}
关于php - XPath 查询在 SimpleXML 中返回 'false',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2590618/