Php 如何从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

我想从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 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];