我想从xml中提取一些数据。
我有这个xml:
<root>
<p>Some text</p>
<p>Even more text</p>
<span class="bla bla">
<span class="currency">EUR</span> 19.95
</span>
</root>
然后我运行这个PHP代码
$xml = simplexml_load_string($xmlString);
$json = json_encode($xml);
$obj = json_decode($json);
print_r($obj);
结果是:
stdClass Object
(
[p] => Array
(
[0] => Some text
[1] => Even more text
)
[span] => stdClass Object
(
[@attributes] => stdClass Object
(
[class] => bla bla
)
[span] => EUR
)
)
如何获取缺少的字符串“19.95”?
答案 0 :(得分:0)
不要将XML转换为JSON /数组。这意味着您丢失了信息和功能。
SimpleXML是litmit,它适用于基本的XML,但它有混合节点之类的问题。在这种情况下,DOM允许更容易处理。
$xml = <<<'XML'
<root>
<p>Some text</p>
<p>Even more text</p>
<span class="bla bla">
<span class="currency">EUR</span> 19.95
</span>
</root>
XML;
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
foreach($xpath->evaluate('/root/span[@class="bla bla"]') as $span) {
var_dump(
$xpath->evaluate('string(span[@class="currency"][1])', $span),
$xpath->evaluate(
'number(span[@class="currency"][1]/following-sibling::text()[1])',
$span
)
);
}
Xpath是一种表达式语言,用于获取DOM的部分内容(Think SQL for XML)。 PHP有几种方法可以访问它。 SimpleXMLElement::xpath()
允许将节点作为SimpleXMLElement对象的数组获取。 DOMXpath::query()
允许您获取节点列表。只有DOMXpath::evaluate()
允许获取节点列表和标量值。
在示例/root/span[@class="bla bla"]
中,获取具有给定class属性的所有span
个元素节点。然后,对于每个节点,它将类货币作为字符串提取span
。第三个表达式将currency
span的第一个后续兄弟文本节点作为数字提取。
答案 1 :(得分:0)
不要相信调试输出,不要转换为JSON或数组,也不要过度思考问题。
输出此字符串就像导航到元素并回显它一样简单:
echo $xml->span;
或者将它变成一个变量,显式地转换为字符串:
$foo = (string)$xml->span
或者如果你想像在ThW的答案中那样使用XPath,你可以使用//span[@class="bla bla"]
找到跨度并回显(注意->xpath()
返回一个数组,所以你想要元素0那个数组):
echo $xml->xpath('//span[@class="bla bla"]')[0];