我将此作为我在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;
}
但是我只得到公式内容,而不是公式之间的文本。 谢谢。
答案 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);
如果您不仅要保存文本内容,而且要保存XML片段,则可以将DOMDocument :: saveXml()与节点一起用作参数。
$result = '';
foreach ($nodes as $node) {
$result .= $node->ownerDocument->saveXml($node);
}
var_dump($result);