1

では、このような XML があるとしましょう…</p>

<blaah1 name="whatever">
<gender name="male">

<example1 baseurl="male/86644/">
<x u="lol.png"/>
<x u="haha.png"/>
<x u="name.png"/>
</example1>

<example2 baseurl="male/27827/">
<x u="page.png"/>
<x u="examp.png"/>
<x u="bottom.png"/>
</example2>

</gender>
</blaah1>

各子u=""の親の最後にコンテンツを表示するにはどうすればよいですか?baseurl

4

2 に答える 2

1

私の知る限り、単一の xpath 式でそれを行うことはできませんが、結果をループする必要があります。このようなループの例:

$base = '';
foreach($xp->query('//@baseurl|//*[@baseurl]/x/@u') as $element) {
    $value = $element->value;
    if (substr($value, -1,1) === '/') {
        $base = $value;
    } else {
        echo $base, $value, "\n";
    }
}

XML ドキュメントの例を使用すると、次のようになります。

male/86644/lol.png
male/86644/haha.png
male/86644/name.png
male/27827/page.png
male/27827/examp.png
male/27827/bottom.png

この例では、union 演算子|を使用して、必要なすべてのノードを一度に取得しています。


私は当初、xpath内で次のことを行うことを探していましたが、AFAIKでは不可能です。ただし、PHP はこれを処理できます。前の xpath クエリ ノードのコンテキストで Xpath 式を実行します。

$array = array_map(function($context) use($xp) {
    return $xp->evaluate('concat(../../@baseurl, .)', $context);
}, iterator_to_array($xp->query('//x/@u')));

次に与える$array

Array
(
    [0] => male/86644/lol.png
    [1] => male/86644/haha.png
    [2] => male/86644/name.png
    [3] => male/27827/page.png
    [4] => male/27827/examp.png
    [5] => male/27827/bottom.png
)

それはおそらくもっと簡単です。

于 2012-12-23T19:17:24.987 に答える
0

If you add an extra element to each child called baseid, and its content to be the parents name like below. . .

<blaah1 name="whatever">
<gender name="male">

<example1 baseurl="male/86644/">
<x u="lol.png" baseid="example1"/>
<x u="haha.png" baseid="example1"/>
<x u="name.png" baseid="example1"/>
</example1>

<example2 baseurl="male/27827/">
<x u="page.png" baseid="example2"/>
<x u="examp.png" baseid="example2"/>
<x u="bottom.png" baseid="example2"/>
</example2>

</gender>
</blaah1>

You could get the parents baseurl and child u with the two xpaths below

$xml_load = simplexml_load_file("myxmlfile.xml");

$x = $xml_load->xpath('//gender[@name="male"]/*/x'); 
foreach($x as $display)
{
$base_url = $xml_load->xpath('//gender[@name="male"]/'.$display["baseid"].''); 
foreach($base_url as $base)
{
echo 'img: '. $base['baseurl'] . $display['u'],'<hr>';
}
}

Finished output . . .

img: male/86644/lol.png
img: male/86644/haha.png
img: male/86644/name.png
img: male/27827/page.png
img: male/27827/examp.png
img: male/27827/bottom.png
于 2012-12-30T13:05:26.253 に答える