如何使用 SimpleXML 对 PHP 中的单个元素执行 XPath?

How to perform XPath on individual elements in PHP using SimpleXML?

我有以下示例 XML 文档:

<?xml version="1.0" encoding="UTF-8" ?>
<database>
    <record>
        <id>1</id>
        <a>5</a>
    </record>
    <record>
        <id>5</id>
        <a>8</a>
    </record>
    <record>
        <id>7</id>
        <!--No a record!-->
    </record>
    <record>
        <id>6</id>
        <a>10</a>
    </record>
</database>

我想遍历每个 "record" 元素并获取它对应的 "a" 元素(如果存在)。

我尝试使用以下代码:

  $xml = new SimpleXMLElement($xmlStringDataFromFile);
  foreach ($xml->record as $record) {
      $id = $record->xpath("//id")[0];
      $a = $record->xpath("//a")[0];
      echo "{$id}: {$a}\n";
  }

然而,执行的 xpath 是针对整个文档的。不在单个 "record" 元素上。因此我得到了以下输出:

1: 5
1: 5
1: 5
1: 5

我想要以下输出:

1: 5
5: 8
7: 
6: 10

我该怎么做?

当您在 XPath 表达式的开头使用 // 时,它将从文档根目录开始搜索,并且您总是得到相同的结果。由于 ida 元素直接位于 record 下,只需使用

  $id = $record->xpath("id")[0];
  $a = $record->xpath("a")[0];

如果它们处于 record 以下的同一级别,则使用 . 启动 XPath 表达式以相对于上下文节点进行搜索:

  $id = $record->xpath(".//id")[0];
  $a = $record->xpath(".//a")[0];