从Xml中删除节点不能在PHP中工作

时间:2016-02-29 02:29:15

标签: php xml dom

我似乎无法解决这个问题......

我有这个Xml:

<?xml version="1.0" encoding="utf-8"?>
<report>
   <report-name name="SEARCH_QUERY_PERFORMANCE_REPORT"/>
   <date-range date="Jan 1, 2016-Jan 31, 2016"/>
   <table>
      <columns>
          <column name="campaignID" display="Campaign ID"/>
          <column name="campaign" display="Campaign"/>
          <column name="adGroupID" display="Ad group ID"/>
          <column name="campaignState" display="Campaign state"/>
          <column name="keyword" display="Keyword"/>
          <column name="searchTerm" display="Search term"/>
          <column name="convertedClicks" display="Converted clicks"/>
          <column name="impressions" display="Impressions"/>
          <column name="clicks" display="Clicks"/>
          <column name="ctr" display="CTR"/>
          <column name="avgCPC" display="Avg. CPC"/>
          <column name="avgPosition" display="Avg. position"/>
          <column name="cost" display="Cost"/>
          <column name="device" display="Device"/>
      </columns>
      <row device="Mobile devices with full browsers" cost="3940000" avgPosition="2.0" avgCPC="3940000" ctr="100.00%" clicks="1" impressions="1" convertedClicks="0" searchTerm="purple jeep near elgin for sale" keyword="jeepdealership" campaignState="enabled" adGroupID="7751248218" campaign="Zeigler CDJ_Dealer Campaign" campaignID="134270778"/>
      <row device="Mobile devices with full browsers" cost="3930000" avgPosition="1.0" avgCPC="3930000" ctr="100.00%" clicks="1" impressions="1" convertedClicks="0" searchTerm="jeep wrangler rubicon 2015" keyword="jeepdealership" campaignState="enabled" adGroupID="7751248218" campaign="Zeigler CDJ_Dealer Campaign" campaignID="134270778"/>
      <row device="Mobile devices with full browsers" cost="2010000" avgPosition="3.0" avgCPC="2010000" ctr="100.00%" clicks="1" impressions="1" convertedClicks="0" searchTerm="altitute jeep cherokee" keyword="2015 jeep Cherokee" campaignState="enabled" adGroupID="18188246418" campaign="Zeigler CDJ_Targeted Campaign" campaignID="134270898"/>
      <row device="Mobile devices with full browsers" cost="3990000" avgPosition="1.0" avgCPC="3990000" ctr="100.00%" clicks="1" impressions="1" convertedClicks="0" searchTerm="2012 jeep cherokee" keyword="2015 +Jeep +cherokee" campaignState="enabled" adGroupID="18188246418" campaign="Zeigler CDJ_Targeted Campaign" campaignID="134270898"/>
  </table>

我需要删除Xml中的一些节点(及其子节点)。我使用以下代码:

$doc = new DOMDocument;
$doc->load('qreport.xml');
$node = $doc->documentElement;
// Retrieve the sub-nodes and remove from xml
$subnodes = $node->getElementsByTagName('columns')->item(0);
$remnodes = $node->removeChild($subnodes);
echo $doc->saveXML();

因此,当将其放入节点名称时,它们将被删除。例如,此代码有效,我可以删除 table 及其子代,我可以删除 report-name date-range

但是我无法删除及其子代。

不清楚我做错了什么。

1 个答案:

答案 0 :(得分:1)

$subnodes = $node->getElementsByTagName('columns')->item(0);
$remnodes = $node->removeChild($subnodes);

您必须在$ somenode的直接父级上调用->removeChild($somenode)。 元素<columns><table>的子元素,而不是documentElement(== $ node)<report>的子元素。

尝试

$subnodes = $node->getElementsByTagName('columns');
if ( $subnodes && $subnodes->length > 0 ) {
    $subnodes = $subnodes->item(0);
    $remnodes = $subnodes->parentNode->removeChild($subnodes);
}

代替。
另见:http://docs.php.net/class.domnode#domnode.props.parentnode