PHP DOM Document - 获取两个节点之间的所有内容

时间:2014-03-24 09:17:57

标签: php xml dom domdocument

我将此作为我在XML文档中加载的XML的一部分:

<error n='\Author'/>
Some Text 1 
<formula type='inline'><math xmlns='http://www.w3.org/1998/Math/MathML'><msup><mrow/> <mrow><mn>1</mn><mo>,</mo></mrow> </msup></math></formula>
Some Text 2 
<formula type='inline'><math xmlns='http://www.w3.org/1998/Math/MathML'><msup><mrow/> <mn>2</mn> </msup></math></formula>

<error n='\address' />

我的目标是将所有内容作为

之间的nodeValue
<error n='\Author' />

并且

<error n='\address' />

如何做到这一点?

我测试了这个:

$author_node = $xpath_xml->query("//error[@n='\Author']/following-sibling::*[1]")->item(0);
if ($author_node != null) {

    $i              = 1;
    $nextNodeName   = "";
    $author     = "";


    while ($nextNodeName != "error" && $i < 20) {
        $nextNodeName = $xpath_xml->query("//error[@n='\Author']/following-sibling::*[$i]")->item(0)->tagName;

        if ($nextNodeName == "error")
            continue;

        $author .= $nextNode->nodeValue;
    }

但是我只得到公式内容,而不是公式之间的文本。 谢谢。

1 个答案:

答案 0 :(得分:1)

*仅选择元素节点,而不选择文本节点。因此,只选择了<formula>个元素。您需要使用node()。但您可以直接使用xpath来选择所需的节点。寻找Kayessian方法的解释。

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);

$nodes = $xpath->evaluate(
  '//error[@n="\\Author"][1]
    /following-sibling::node()
      [
        count(
          .|
          //error[@n="\\Author"][1]
            /following-sibling::error[@n="\\address"][1]
              /preceding-sibling::node()
        )
        =
        count(
          //error[@n="\\Author"][1]
            /following-sibling::error[@n="\\address"][1]
              /preceding-sibling::node()
        )
      ]'
);

$result = '';
foreach ($nodes as $node) {
  $result .= $node->nodeValue;
}
var_dump($result);

演示:https://eval.in/125494

如果您不仅要保存文本内容,而且要保存XML片段,则可以将DOMDocument :: saveXml()与节点一起用作参数。

$result = '';
foreach ($nodes as $node) {
  $result .= $node->ownerDocument->saveXml($node);
}
var_dump($result);