DOMXpath::evaluate()
允许您从DOM中获取节点列表和标量值。
因此,您可以使用XPath表达式直接获取值:
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
var_dump(
$xpath->evaluate('string(/root/level[@name="level2"]/@name)')
);
输出:
string(6) "level2"
Xpath表达式
在root
中的所有level
元素节点:
/root/level
具有特定名称属性的节点:
/root/level[@name="level2"]
您想获取的值(用于验证的name
属性):
/root/level[@name="level2"]/@name
转换为字符串,如果找到节点,则结果将为空字符串:
string(/root/level[@name="level2"]/@name)
循环遍历节点,将其用作上下文
如果您需要为节点执行多个表达式,最好单独获取它并使用foreach()
。 DOMXpath::evaluate()
的第二个参数是上下文节点。
foreach ($xpath->evaluate('/root/level[@name="level2"]') as $level) {
var_dump(
$xpath->evaluate('string(@name)', $level)
);
}
节点列表长度
如果需要处理未发现节点,则可以检查 DOMNodeList::$length
属性。
$levels = $xpath->evaluate('/root/level[@name="level2"]');
if ($levels->length > 0) {
$level = $levels->item(0);
var_dump(
$xpath->evaluate('string(@name)', $level)
);
} else {
}
count()表达式
您也可以使用count()
表达式来验证是否存在元素。
var_dump(
$xpath->evaluate('count(/root/level[@name="level2"])')
);
输出:
float(1)
布尔结果
可以将其作为Xpath条件,并返回布尔值。
var_dump(
$xpath->evaluate('count(/root/level[@name="level2"]) > 0')
);
输出:
bool(true)
/root/level[1]
。 - splash58XPath
只有在根节点内只有一个<level>
时才能正常工作。 - dr_rklevel[@name="level2"]
,将其限制/固定到一个级别元素。 - VolkerK