繁体   English   中英

使用PHP从XML删除节点

[英]removing nodes from XML with PHP

在此示例Place2中,我试图删除所有与特定NodeName不匹配的NodePrice。 这是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。 我究竟做错了什么?

上一篇文章是如何使用PHP修改xml文件

这是我的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');

在XML和DOM中删除节点时,通常会留出空白。 这是由于文档的格式,并且实际数据节点之前通常有一个DOMText节点。 为了缩小这一差距,您还需要删除该节点以及数据。

foreach ($nodesToDelete as $node) {
    $prevNode = $node->previousSibling;
    if ( $prevNode != null && $prevNode instanceof DOMText )    {
        $node->parentNode->removeChild($prevNode);
    }
    $node->parentNode->removeChild($node);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM