Как получить второго родного брата с помощью 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
}
2
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