2

これは私の構造です:

<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 
}
4

1 に答える 1

2

ドキュメントのスキーマに明示的に記載されていない限り、要素の順序に依存せず、ユーザー要素をコンテキストノードとして渡すことで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
于 2012-09-24T07:40:21.910 に答える