我有以下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等)?
答案 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
节点的任何子节点。
当然,由于其中还有包含更多子节点的节点(如a
和d
),我们需要对其进行过滤。所以包含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
)