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 表达式。

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

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

于 2013-01-04T21:08:03.713 回答
1

我得出了与 Dimitri M 类似的结论,它基于之前的 Q&A如何使用 XPath 表达式选择所有叶节点?.

叶节点是最外层的节点,也就是您要查找的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 回答