使用 PHP 删除 XML 文件的元素

我需要使用 PHP 删除 XML 文件的元素。


这是我的 XML 文件


<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope

    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <soap:Body>

        <GetVehiculesLocationResponse xmlns="http://google.fr/">

            <GetVehiculesLocationResult>

                <Location>

                    <idVH>001</idVH>

                    <date>2020-06-30T09:06:39</date>

                    <latitude>111111</latitude>

                    <longitude>11111</longitude>

                </Location>

                <Location>

                    <idVH>002</idVH>

                    <date>2020-04-02T13:45:51</date>

                    <latitude>1111111</latitude>

                    <longitude>111111</longitude>

                </Location>

                <Location>

                    <idVH>11111111</idVH>

                    <date>2020-03-24T21:49:46</date>

                    <latitude>1111111</latitude>

                    <longitude>11111111</longitude>

                </Location>

            </GetVehiculesLocationResult>

        </GetVehiculesLocationResponse>

    </soap:Body>

</soap:Envelope>

我想删除元素(在本例中Location),其中idVH是某个值(在本例中为 002)


我已经尝试过,但它不起作用


$xml1 = simplexml_load_string($result); 

$items = $xml1->xpath("/soap:Envelope/soap:Body/GetVehiculesLocationResponse/GetVehiculesLocationResult/Location[idVH = 002]");


foreach ($items as $i) unset($i[0]);

   echo $xml1->asXML();


慕后森
浏览 173回答 2
2回答

白衣染霜花

问题是该元素GetVehiculesLocationResponse定义了一个新的默认命名空间,因此子元素都在该新命名空间中......<GetVehiculesLocationResponse xmlns="http://google.fr/">因此,首先注册新的名称空间,然后将其用作较低级别元素中的前缀......$xml1->registerXPathNamespace("d", "http://google.fr/");$items = $xml1->xpath("/soap:Envelope/soap:Body/d:GetVehiculesLocationResponse/d:GetVehiculesLocationResult/d:Location[d:idVH = '002']");

开满天机

考虑XSLT(XPath 的同级语言),它是一种专用语言,旨在转换 XML 文件,特别适合处理许多元素。事实上,您甚至可以将参数001从 PHP 传递到 XSLT。PHP 可以使用库的xsl类运行 XSLT 1.0 脚本DOMDocument。XSLT<?xml version="1.0" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                              xmlns:googl="http://google.fr/">     <xsl:output method="xml" indent="yes"/>   <xsl:strip-space elements="*"/>   <!-- DEFINE PARAM WITH DEFAULT -->   <xsl:param name="id_param">001</xsl:param>    <!-- IDENTITY TRANSFORM -->    <xsl:template match="@* | node()">        <xsl:copy>            <xsl:apply-templates select="@* | node()"/>        </xsl:copy>    </xsl:template>    <!-- KEEP NODES BY PARAM VALUE -->    <xsl:template match="googl:GetVehiculesLocationResult">        <xsl:copy>            <xsl:copy-of select="googl:Location[googl:idVH != $id_param]"/>        </xsl:copy>    </xsl:template></xsl:stylesheet>PHP (在循环中将参数传递给 XSLT)// LOAD XML$xml = new DOMDocument('1.0', 'UTF-8');$xml->load($data->xmlFile);// LOAD XSLT $xsl = new DOMDocument('1.0', 'UTF-8');   $xsl->load('XSLT_Script.xsl');// INITIALIZE TRANSFORMER$proc = new XSLTProcessor;$proc->importStyleSheet($xsl);foreach($param as array('001', '002')) {     // SET PARAMETER VALUE    $proc->setParameter('', 'id_param', $param);    // TRANSFORM SOURCE    $xml = $proc->transformToDoc($xml);}// ECHO TO SCREENecho $xml->saveXML();// SAVE TO FILEfile_put_contents($data->xmlFile, $xml);输出<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">   <soap:Body>      <GetVehiculesLocationResponse xmlns="http://google.fr/">         <GetVehiculesLocationResult>            <Location>               <idVH>11111111</idVH>               <date>2020-03-24T21:49:46</date>               <latitude>1111111</latitude>               <longitude>11111111</longitude>            </Location>         </GetVehiculesLocationResult>      </GetVehiculesLocationResponse>   </soap:Body></soap:Envelope>
打开App,查看更多内容
随时随地看视频慕课网APP