0

私は次のフィードを持っています:

$result = apiCall('somevalue', 'somevalue', array('somevalue' => $some_string));

これはjson形式です。私はそれをxmlに変換するのはとても簡単です

$xml = simplexml_load_string($result);

xmlフィードは次のようになります。

<?xml version="1.0" encoding="ISO-8859-15"?>
    <response>
        <status>success</status>
        <code>200</code>
        <message>
            <a>
                <g>val1</g>
                <b>val2</b>
                <c>val3</c>
            </a>
            <d>
                <e>val4</e>
                <f>val5</f>
            </d>
        </message>
    </response>

すべてのノード値(つまり、val1、val2、val3、val4、val5など)を取得するための簡単で高速な方法はありますか?

4

2 に答える 2

1

私はうまくいくと思う何かを書きました:

<?php

$xml = <<<EOD
<?xml version="1.0" encoding="ISO-8859-15"?>
<response>
    <status>success</status>
    <code>200</code>
    <message>
        <a>
            <g>val1</g>
            <b>val2</b>
            <c>val3</c>
        </a>
        <d>
            <e>val4</e>
            <f>val5</f>
        </d>
    </message>
</response>
EOD;

$output = array();
$test = simplexml_load_string($xml);
$result = $test->xpath('message//*[not(*)]');
while(list(, $node) = each($result)) {
    array_push($output, (string) $node);
}

var_dump($output);

?>

私は多くのこと(属性)でそれをテストしていませんが、提供された入力でそれは期待される出力を与えます。messageこれは、ノードの子を取得するxpath式を確認できるようなものです。

もちろん、さらに多くの子ノード(aおよびなどd)を含むノードもあるため、それらをフィルターで除外する必要があります。したがって、最後の部分には、not(*)サブ子がない子のみが選択されるという意味が含まれています。

私はXPATHの専門家ではないので、おそらくこれを達成するためのより速い方法がありますが、これでうまくいくと思います。

于 2013-01-04T21:08:03.713 に答える
1

Dimitri M と同様の結論に達しました。これは以前の Q&A How to select all leaf nodes using XPath expression?に基づいています。.

Leaf-Nodes は、探しているノードである最も外側のノードです。ここでは、このtext()場合のノードです。

$nodeValues = array_map(
    'trim',
    simplexml_load_string($xml)->xpath('message//*[not(*)]/text()')
);

これ$xmlが XML 入力で$nodeValuesあるとすると、 は探しているノード値を表すすべての文字列の配列になります。例:

Array
(
    [0] => val1
    [1] => val2
    [2] => val3
    [3] => val4
    [4] => val5
)
于 2013-01-04T21:33:45.433 に答える