如何在 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"
我正在尝试解析包含一些用户信息的 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"