代码之家  ›  专栏  ›  技术社区  ›  Drew

xpath查询在simplexml中返回“false”

  •  2
  • Drew  · 技术社区  · 16 年前

    我有一个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']");
    

    但这又是错误的。

    我已经尝试过:

    • /meta_tree/meta_data[meta_cat='Content Provider']
    • //meta_data[meta_cat='Content Provider']
    • meta_data[meta_cat='Content Provider'] (这将返回一个数组,但该数组为空)

    我一直在使用 AquaPath ,这将验证我的查询,因此我不确定我做错了什么。

    有人有什么想法吗?

    DJS。

    编辑:根据托洛马克的建议,这里有更多的信息。

    元素是一个较大文档的片段,如下所示(名称已替换为***以保护无辜者):

    <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();
    }
    

    回答: 默认命名空间出现问题。除非有人知道如何在simplexmleelement中注册xmlns默认名称空间,否则我选择将它们去掉而不是处理名称空间。

    2 回复  |  直到 13 年前
        1
  •  0
  •   VolkerK    16 年前

    尝试

    $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"
      }
    }
    
        2
  •  0
  •   Drew    13 年前

    默认命名空间出现问题。除非有人知道如何在simplexmleelement中注册xmlns默认名称空间,否则我选择将它们去掉而不是处理名称空间。

    推荐文章