Php 如何从xml中获取文本节点
我想从xml中提取一些数据 我有以下xml:Php 如何从xml中获取文本节点,php,xml,simplexml,Php,Xml,Simplexml,我想从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> 结果是: stdClass Obj
<root>
<p>Some text</p>
<p>Even more text</p>
<span class="bla bla">
<span class="currency">EUR</span> 19.95
</span>
</root>
结果是:
stdClass Object
(
[p] => Array
(
[0] => Some text
[1] => Even more text
)
[span] => stdClass Object
(
[@attributes] => stdClass Object
(
[class] => bla bla
)
[span] => EUR
)
)
如何获取缺少的字符串“19.95”?不要将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
)
);
}
$xml=evaluate('string(span[@class=“currency”][1]),$span),
$xpath->evaluate(
'编号(span[@class=“currency”][1]/以下同级::text()[1]),
$span
)
);
}
Xpath是一种用于获取部分DOM的表达式语言(想想SQL for XML)。PHP有几种方法来访问它SimpleXMLElement::xpath()
允许将节点作为SimpleXMLElement对象的数组获取DOMXpath::query()
允许您获取节点列表。只有DOMXpath::evaluate()
允许获取节点列表和标量值
在示例中,
/root/span[@class=“bla bla”]
获取具有给定class属性的所有span
元素节点。然后,对于每个节点,它以类currency作为字符串获取span
。第三个表达式以数字形式获取货币跨度的第一个同级文本节点。不要信任调试输出,不要转换为JSON或数组,也不要过度思考问题
输出此字符串非常简单,只需导航到元素并回显它:
echo $xml->span;
或者,要将其转换为变量,请显式转换为字符串:
$foo = (string)$xml->span
或者,如果您想像ThW的回答中那样使用XPath,您可以使用//span[@class=“bla bla”]
找到span并回显它(注意->XPath()
返回一个数组,因此您需要该数组的元素0):
虽然这包括了XPath的一些巧妙技巧,但对于所描述的任务来说,这有点过分了。SimpleXML与此XML完全没有“问题”,除了print\r
的输出不完整。
$foo = (string)$xml->span
echo $xml->xpath('//span[@class="bla bla"]')[0];