为了账号安全,请及时绑定邮箱和手机立即绑定

使用 PHP 删除 XML 文件的元素

使用 PHP 删除 XML 文件的元素

PHP
慕后森 2023-07-08 16:25:41
我需要使用 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();
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

问题是该元素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']");



查看完整回答
反对 回复 2023-07-08
?
开满天机

TA贡献1786条经验 获得超12个赞

考虑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 SCREEN

echo $xml->saveXML();


// SAVE TO FILE

file_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>


查看完整回答
反对 回复 2023-07-08
  • 2 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信