簡體   English   中英

如何在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選擇了文檔中的所有元素,但是您需要在當前上下文中選擇元素。 從查詢表達式中刪除//

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM