Как получить второго родного брата с помощью xpath из xml


Это моя структура:

<Users>
    <User>
        <username>admin</username>
        <server>10.xx.xx.xx</server>
        <image>images/pic.png</image>
    </User>
    <User>
        <username>bob</username>
        <server>10.xx.xx.xx</server>
        <image>images/pic2.png</image>
    </User>
</Users>

Теперь у меня есть этот код, который возвращает мне значение сервера с узла, у которого есть определенное имя пользователя, которое я ищу.

$query = '//Users/User/username[. =  "'.$_SESSION['SESS_FIRST_NAME'].'"]';
$entries = $xpath->query($query);

foreach ($entries as $entry) {
    //Getting the "server" node value
    $server=$entry->nextSibling->nextSibling->nodeValue; 
    //I wanted to have one more variable here which will save me the image string in the global php variable
    $images=$entry->nextSibling->nextSibling->nextSibling->nodeValue; //this is giving me a server value instead of image value 
}
Author: user123_456, 2012-09-24

1 answers

Если в схеме документа явно не указано иное, я бы не полагался на порядок элементов, а либо запрашивал элементы через xpath, передавая пользовательский элемент в качестве контекстного узла (см. Пример), либо перебирал дочерние элементы пользовательского элемента и извлекал то, что необходимо (например, в массиве php).

<?php
$doc = new DOMDOcument;
$doc->loadxml( getData() );

$xpath = new DOMXPath( $doc );

$query = '/Users/User[username=  "'.'bob'.'"]';
foreach( $xpath->query($query) as $user ) {
    $username = singleNodeValue($xpath->query('username', $user)); // ok, you already have this one....
    $server = singleNodeValue($xpath->query('server', $user));
    $image = singleNodeValue($xpath->query('image', $user));

    printf("%s, %s, %s\r\n", $username, $server, $image);
}

function singleNodeValue($nodeset) {
    // add tests here....
    return $nodeset->item(0)->nodeValue;
}

function getData() {
    return <<< eox
<Users>
    <User>
        <username>admin</username>
        <server>10.xx.xx.xx</server>
        <image>images/pic.png</image>
    </User>
    <User>
        <username>bob</username>
        <server>10.xx.xx.xx</server>
        <image>images/pic2.png</image>
    </User>
</Users>
eox;
}

Печать

bob, 10.xx.xx.xx, images/pic2.png
 2
Author: VolkerK, 2012-09-24 07:40:21