如何从Feed中获取所有节点值

时间:2013-01-04 20:41:20

标签: php xml json simplexml

我有以下Feed:

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

是json格式。我可以很容易地用

将它变成xml
$xml = simplexml_load_string($result);

xml Feed看起来如下:

<?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等)?

2 个答案:

答案 0 :(得分: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);

?>

我没有对很多东西(属性)进行测试,但是在提供的输入上它给出了预期的输出。 它的作用就像你可以看到一个xpath表达式来检索message节点的任何子节点。

当然,由于其中还有包含更多子节点的节点(如ad),我们需要对其进行过滤。所以包含not(*)的最后一部分意味着它只会选择那些没有子子的孩子。

我不是XPATH专家,所以可能有更快的方法来实现这一点,但我认为这样做。

答案 1 :(得分:1)

我得到了类似Dimitri M的类似结论,它基于之前的Q&amp; A How to select all leaf nodes using XPath expression?

叶子节点是最外面的节点,这是您正在寻找的节点,在这种情况下是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
)