php - XPath 查询在 SimpleXML 中返回 'false'

标签 php xml xpath simplexml

我有一个这样的 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/

相关文章:

php - Symfony2 的奇怪缓存行为

php - http_head() 不被解释器识别?

java - 在 Java 中从文档中获取 xml 字符串

c# - H结果 : 0xC00CE556 - Loading string to XML

XML 规范和 UTF-16

php - 从多个表中删除数据库中的数据

php - 确定文件是否为空的最佳方法(php)?

python - 在 Scrapy 中使用规范化空间

xml - VBScript从XML节点分配变量

java - 如何在 Java 中使用 XPath 查询选择元素的属性值并将其放入字符串中?