[英]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
選擇了文檔中的所有元素,但是您需要在當前上下文中選擇元素。 從查詢表達式中刪除//
。
$username = $xpath->query ( 'email', $users->item(0) );
在演示中查看結果
位置路徑開頭的斜杠( /
)使其相對於文檔節點。 上下文節點將被忽略。 如果在其后接另一個斜杠,則使用后代軸。 //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()
可以根據表達式返回節點列表或標量。 它允許您將節點強制轉換為Xpath表達式中的字符串。
Xpath表達式可以包含條件,因此要按位置輸出電子郵件,您可以執行以下操作:
foreach ($xpath->evaluate('//user[2]') as $user) {
var_dump($xpath->evaluate('string(email)', $user));
}
輸出:
string(14) "tyler@test.com"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.