我正在尝试删除与特定NodeName不匹配的所有NodePrices,例如Place2。这是XML的一个示例
<DocHeader>
<DocTitle>Node Price Report</DocTitle>
<DocRevision>1</DocRevision>
<DocConfidentiality>
<DocConfClass>PUB</DocConfClass>
</DocConfidentiality>
<CreatedAt>2018-02-03T13:02:01</CreatedAt>
</DocHeader>
<DocBody>
<NodePrices>
<NodeName>Place1</NodeName>
<Contact>Employee1</Contact>
</NodePrices>
<NodePrices>
<NodeName>Place2</NodeName>
<Contact>Employee2</Contact>
</NodePrices>
<NodePrices>
<NodeName>Place3</NodeName>
<Contact>Employee3</Contact>
</NodePrices>
</DocBody>
我发现了一个先前提出的问题,看起来像我的问题的答案,但结果不是我的预期。当我运行代码并回显结果时,它们就是我所期望的,我看到了Place2.当我将结果保存到文件时,Place2丢失了,我所拥有的就是DocHeader。我做错了什么?
上一篇文章是How to modify xml file using PHP
这是我的PHP
$dom=new DOMDocument();
$dom->load("Nodes.xml");
$root=$dom->documentElement;
$nodesToDelete=array();
$markers=$root->getElementsByTagName('NodePrices');
// Loop trough childNodes
foreach ($markers as $marker) {
$NodeName=$marker->getElementsByTagName('NodeName')->item(0)->textContent;
if($NodeName=='Place2') {
continue;
}
$nodesToDelete[]=$marker;
}
// You delete the nodes
foreach ($nodesToDelete as $node) {
$node->parentNode->removeChild($node);
}
echo $dom->saveXML();
$dom->save('FilteredNodes.xml');
答案 0 :(得分:0)
在XML和DOM中删除节点时,通常会留下空白。这是由于文档的格式化,并且在实际数据节点之前通常存在DOMText节点。要缩小这个差距,您还需要删除此节点以及数据...
foreach ($nodesToDelete as $node) {
$prevNode = $node->previousSibling;
if ( $prevNode != null && $prevNode instanceof DOMText ) {
$node->parentNode->removeChild($prevNode);
}
$node->parentNode->removeChild($node);
}