如何在 php 中使用 DOMXPath 在特定上下文中查找元素?

How to find element in specific context using DOMXPath in php?

我正在尝试解析包含一些用户信息的 xml 文件。像这样

users.xml

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user>
        <name>Alexander</name>
        <email>alexander@test.com</email>
    </user>
    <user>
        <name>Tyler</name>
        <email>tyler@test.com</email>
    </user>
</users>

我正在使用 DOMXpath 提取此 xml 中的所有用户以及所有这些字段。 在 xml 文件中,我有 15 个用户,当我在此代码中搜索有关一个用户的所有字段时

$username = $xpath->query ( '//email', $users->item(0) );

我得到 15 个长度,而不是 1 个。我的意思是 query 正在搜索所有 xml 而不是寻找实际用户。 我做错了什么?

xml_query.php

$xml = new DOMDocument();
$xml->loadXML( $xml_content );
$xpath = new DOMXPath($xml);

$users = $xpath->query( '//user' );
var_dump( $users->item(0) );
$username = $xpath->query ( '//email', $users->item(0) );

var_dump( $username );

因为//email select 文档中的所有元素但是您需要select 当前上下文中的元素。从查询表达式中删除 //

$username = $xpath->query ( 'email', $users->item(0) );

结果见demo

位置路径开头的斜杠 (/) 使其相对于文档节点。上下文节点将被忽略。如果后面跟着另一个斜杠,则使用后代轴。 //email/descendant::email 的缩写。默认轴是 child.

$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user>
        <name>Alexander</name>
        <email>alexander@test.com</email>
    </user>
    <user>
        <name>Tyler</name>
        <email>tyler@test.com</email>
    </user>
</users>
XML;

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
foreach ($xpath->evaluate('//user') as $user) {
  var_dump($xpath->evaluate('string(email)', $user));
}

输出:

string(18) "alexander@test.com"
string(14) "tyler@test.com"

DOMXpath::evaluate() 可以 return 节点列表或标量,具体取决于表达式。它允许您直接在 Xpath 表达式中将节点转换为字符串。

Xpath 表达式可以包含条件,因此要按位置输出电子邮件,您可以执行以下操作:

foreach ($xpath->evaluate('//user[2]') as $user) {
  var_dump($xpath->evaluate('string(email)', $user));
}

输出:

string(14) "tyler@test.com"