如何从xml获取文本节点

时间:2017-01-05 13:21:05

标签: 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>

然后我运行这个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”?

2 个答案:

答案 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];