PHP根据值删除XML节点

时间:2015-12-18 11:23:00

标签: php xml

我试图使用PHP从XML中删除特定节点。这是XML的结构:

<ArrivingFlights>
<flight>
    <to>Michelle</to>
    <from>Brianna xx</from>
    <imagepath>0001.jpg</imagepath>
    <templateStyle>template1</templateStyle>
    <time>17:00</time>
    <date>18/12/15</date>
</flight>
 <flight>
    <to>Ger</to>
    <from>Mammy xx</from>
    <imagepath>0002.jpg</imagepath>
    <templateStyle>template1</templateStyle>
    <time>08:00</time>
    <date>21/12/15</date>
</flight>
<flight>
    <to>Ciara</to>
    <from>Vikki xx</from>
    <imagepath>0003.jpg</imagepath>
    <templateStyle>template1</templateStyle>
    <time>11:00</time>
    <date>17/12/15</date>
</flight>
 </ArrivingFlights>

我有一个PHP文件,用于获取FileName,因此我可以删除基于该文件名的节点并替换它。这是我的PHP:

<?php


    $id = $_GET['imagepath'];

$xmldoc = new DOMDocument();
$xmldoc->load('newcoke.xml');
$root   = $xmldoc->documentElement;
$fnode  = $root->firstChild;
// we retrieve the chapter and remove it from the book
$items = $xmldoc->getElementsByTagName('flight');
foreach ($items as $item){
    $node = $item->getElementsByTagName('imagepath')->item(0);
    if ($node->nodeValue == $id){
        $node->parentNode->removeChild($node);            
    }
}
$xmldoc->save('newXmlFile.xml');


?>

这个SORT OF工作,当我查看newFile.xml时,它正在删除&#34; ImagePath&#34;但是我希望它能够删除整个&#34;航班&#34;节点,所以基本上它的父节点。 这是我得到的结果,如果我通过它0001.jpg:

    <flight>
    <to>Michelle</to>
    <from>Brianna xx</from>

    <templateStyle>template1</templateStyle>
    <time>17:00</time>
    <date>18/12/15</date>
</flight>
 <flight>
    <to>Ger</to>
    <from>Mammy xx</from>
    <imagepath>0002.jpg</imagepath>
    <templateStyle>template1</templateStyle>
    <time>08:00</time>
    <date>21/12/15</date>
</flight>
<flight>
    <to>Ciara</to>
    <from>Vikki xx</from>
    <imagepath>0003.jpg</imagepath>
    <templateStyle>template1</templateStyle>
    <time>11:00</time>
    <date>17/12/15</date>
</flight>

3 个答案:

答案 0 :(得分:1)

考虑使用XSLT,这是重组XML文件的专用语言。 PHP维护着一个XSLT 1.0处理器。因此,不需要foreach循环或if逻辑调节,因为样式表脚本将处理此类处理并且非常有效。您甚至可以在PHP中嵌入脚本以动态传递$id变量:

嵌入 XSLT

PHP

// Retrieve imagepath value
$id = $_GET['imagepath'];

// Load the XML source
$doc = new DOMDocument();
$doc->load('Flights.xml');

// Parse XSLT
$xsl = new DOMDocument;
$xslstr = '<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
           <xsl:output version="1.0" encoding="UTF-8" indent="yes" />
           <xsl:strip-space elements="*"/>

            <!-- Identity Transform -->
            <xsl:template match="@*|node()">
              <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
              </xsl:copy>
            </xsl:template>  

            <xsl:template match="flight[imagepath=\''.$id.'\']"/>
           </xsl:transform>';

$xsl->loadXML($xslstr);

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 

// Transform XML source
$newXml = $proc->transformToXML($doc);

// Save output to file
$xmlfile ='Output.xml';
file_put_contents($xmlfile, $newXml);

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<ArrivingFlights>
  <flight>
    <to>Ger</to>
    <from>Mammy xx</from>
    <imagepath>0002.jpg</imagepath>
    <templateStyle>template1</templateStyle>
    <time>08:00</time>
    <date>21/12/15</date>
  </flight>
  <flight>
    <to>Ciara</to>
    <from>Vikki xx</from>
    <imagepath>0003.jpg</imagepath>
    <templateStyle>template1</templateStyle>
    <time>11:00</time>
    <date>17/12/15</date>
  </flight>
</ArrivingFlights>

答案 1 :(得分:0)

由于flight$item,您应该删除$item而不是$node

$item->parentNode->removeChild($item);

答案 2 :(得分:0)

您可以根据需要多次使用parentNode,但显然需要您确信您的XML结构不会发生变化。在这种特殊情况下,您只需要进一步上升,如下所示:

$node->parentNode->parentNode->removeChild($node->parentNode);

但是,当您已经处于设置$item的循环中时,请直接删除它:

$item->parentNode->removeChild($item);