【问题标题】:How to query a xml file using xpath (php) ?如何使用 xpath (php) 查询 xml 文件?
【发布时间】:2018-12-23 10:52:18
【问题描述】:

我正在尝试使用 XPath 查询 XML 文件。但作为回报,我什么也得不到。我想我将查询格式化为假。

XML

<subject id="Tom">
   <relation unit="ITSupport" role="ITSupporter" />
  </subject>

PHP

$xpath = new DOMXpath($doc);
            $role = 'ITSupporter';
           $elements = $xpath-> query("//subject/@id[../relation/@role='".$role."']");              
           foreach ($elements as $element) {    
              $name = $element -> nodeValue;
              $arr[$i] = $name;
              $i = $i + 1;
           }    

如何获得 ID TOM?我想将它保存到例如 $var

【问题讨论】:

    标签: php xml xpath phpquery


    【解决方案1】:

    构建 Xpath 表达式:

    • 获取任何subject元素
      //subject
    • ... 带有子元素 relation
      //subject[relation]
    • ...具有role 属性和给定文本
      //subject[relation/@role="ITSupporter"]
    • ...并获取subject@id属性
      //subject[relation/@role="ITSupporter"]/@id

    此外,可以清理源。 PHP 数组可以使用$array[] 语法将新元素推入其中。

    放在一起:

    $xml = <<<'XML'
    <subject id="Tom">
      <relation unit="ITSupport" role="ITSupporter" />
    </subject>
    XML;
    
    $role = 'ITSupporter';
    
    $document = new DOMDocument();
    $document->loadXML($xml);
    $xpath = new DOMXpath($document);
    
    $ids = [];
    foreach ($xpath->evaluate("//subject[relation/@role='".$role."']/@id") as $idAttribute) {
      $ids[] = $idAttribute->value;
    }
    var_dump($ids);
    

    输出:

    array(1) { 
      [0]=> 
      string(3) "Tom" 
    }
    

    如果您只期望一个结果,您可以在 Xpath 中转换它:

    $id = $xpath->evaluate(
      "string(//subject[relation/@role='".$role."']/@id)"
    );
    var_dump($id);
    

    输出:

    string(3) "Tom"
    

    XML 命名空间

    查看评论中发布的示例,您的 XML 使用不带前缀的命名空间 http://cpee.org/ns/organisation/1.0。 XML 解析器将解析它,因此您可以将节点读取为{http://cpee.org/ns/organisation/1.0}subject。这里有 3 个例子都可以解决这个问题:

    • &lt;subject xmlns="http://cpee.org/ns/organisation/1.0"/&gt;
    • &lt;cpee:subject xmlns:cpee="http://cpee.org/ns/organisation/1.0"/&gt;
    • &lt;c:subject xmlns:c="http://cpee.org/ns/organisation/1.0"/&gt;

    Xpath 表达式也是如此。但是 Xpath 没有 默认命名空间。您需要注册一个使用您选择的前缀。这个 允许 Xpath 引擎解析 //org:subject//{http://cpee.org/ns/organisation/1.0}subject 之类的内容。

    PHP 不需要改动太多:

    $xml = <<<'XML'
    <subject id="Tom" xmlns="http://cpee.org/ns/organisation/1.0">
      <relation unit="ITSupport" role="ITSupporter" />
    </subject>
    XML;
    
    $role = 'ITSupporter';
    
    $document = new DOMDocument();
    $document->loadXML($xml);
    $xpath = new DOMXpath($document);
    // register a prefix for the namespace
    $xpath->registerNamespace('org', 'http://cpee.org/ns/organisation/1.0');
    
    $ids = [];
    // address the elements using the registered prefix
    $idAttributes = $xpath->evaluate("//org:subject[org:relation/@role='".$role."']/@id");
    foreach ($idAttributes as $idAttribute) {
      $ids[] = $idAttribute->value;
    }
    var_dump($ids);
    

    【讨论】:

    • 结果我得到:array(0) { } :(
    • 那么你有一个不同的 XML - 可能有一个命名空间。在不修改的情况下尝试我的示例 (3v4l.org/oJLGG)。
    • 亲爱的@ThW,您的代码正在运行!你是对的。但这是我必须查询的 XML 文件:3v4l.org/uKTS7。不应该一样吗? :S 我想用ID查询所有的ID(名字)(比如ITSupporter)
    • 不,您的 XML 使用命名空间。 //subject 在“空”命名空间中查找元素。你可以把它想象成&lt;subject xmlns=""/&gt;。我在答案中添加了一些解释和修改示例。
    • 亲爱的@ThW,我试过你的例子,它只有在我复制粘贴时才有效。但是当我从文件中读取 XML 代码时,我又得到了 null。你能帮我吗,我真的不明白,我做错了什么。我阅读了 XML: > $xml = 'organisation.xml'; > $document = 新的 DOMDocument(); > $document->loadXML($xml); > $xpath = new DOMXpath($document);
    【解决方案2】:

    试试这个 XPath

    //subject[relation/@role='".$role."']/@id
    

    您将谓词应用于id 属性,而不是subject 元素。

    【讨论】:

    • 嗯,我仍然一无所获。 :( { "taskname": "Read order", "employee": "leer", "role": "ITSupporter", "form": "form1.html", "done": 0 }
    • 在员工下应该是名称。但我只得到我的 var 的初始值。该查询不保存任何内容
    【解决方案3】:

    通过 id 获取元素与通过 $role 内容获取元素相同。 因此,如下所示; $xpath-&gt;query("//*[@id='$id']")-&gt;item(0); 换句话说,@id 应该在 '[' 括号中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多