我有以下XML:

<root>
   <level name="level1">
       <!-- More children <level> -->
   </level>

   <level name="level2">
       <!-- Some more children <level> -->
   </level>
</root>


如何直接在<level>下提取<root>,以便相对于提取的$xml->xpath('//some-query')运行XPath查询,例如<level>

最佳答案

DOMXPath::query的第二个参数是上下文节点。只需传递您先前“找到”的DOMNode实例,查询就可以“相对”运行到该节点。例如。

<?php
$doc = new DOMDocument;
$doc->loadxml( data() );

$xpath = new DOMXPath($doc);
$nset = $xpath->query('/root/level[@name="level1"]');
if ( $nset->length < 1 ) {
    die('....no such element');
}
else {
    $elLevel = $nset->item(0);

    foreach( $xpath->query('c', $elLevel) as $elC) {
        echo $elC->nodeValue, "\r\n";
    }
}


function data() {
    return <<< eox
<root>
    <level name="level1">
        <c>C1</c>
        <a>A</a>
        <c>C2</c>
        <b>B</b>
        <c>C3</c>
    </level>
    <level name="level2">
        <!-- Some more children <level> -->
    </level>
</root>
eox;
}




但是除非您必须执行多个单独的(可能是复杂的)后续查询,否则很有可能没有必要

<?php
$doc = new DOMDocument;
$doc->loadxml( data() );

$xpath = new DOMXPath($doc);
foreach( $xpath->query('/root/level[@name="level1"]/c') as $c ) {
    echo $c->nodeValue, "\r\n";
}


function data() {
    return <<< eox
<root>
    <level name="level1">
        <c>C1</c>
        <a>A</a>
        <c>C2</c>
        <b>B</b>
        <c>C3</c>
    </level>
    <level name="level2">
        <c>Ahh</c>
        <a>ouch</a>
        <c>no</c>
        <b>wrxl</b>
    </level>
</root>
eox;
}


仅使用一个查询就具有相同的输出。

07-24 09:37
查看更多