如何使用 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 表达式的开头使用 //
时,它将从文档根目录开始搜索,并且您总是得到相同的结果。由于 id
和 a
元素直接位于 record
下,只需使用
$id = $record->xpath("id")[0];
$a = $record->xpath("a")[0];
如果它们处于 record
以下的同一级别,则使用 .
启动 XPath 表达式以相对于上下文节点进行搜索:
$id = $record->xpath(".//id")[0];
$a = $record->xpath(".//a")[0];
我有以下示例 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 表达式的开头使用 //
时,它将从文档根目录开始搜索,并且您总是得到相同的结果。由于 id
和 a
元素直接位于 record
下,只需使用
$id = $record->xpath("id")[0];
$a = $record->xpath("a")[0];
如果它们处于 record
以下的同一级别,则使用 .
启动 XPath 表达式以相对于上下文节点进行搜索:
$id = $record->xpath(".//id")[0];
$a = $record->xpath(".//a")[0];