PHP-删除xml中的特殊字符

如何解决PHP-删除xml中的特殊字符

如何删除打开和关闭XML之间的特殊字符?

我尝试使用递归函数。因此在这种情况下,它对我不起作用。

$sampleXML = '<?xml version="1.0" encoding="ISO-8859-1"?>  
<mainTag type="user">
<note>
    <PersonName>
        <GivenName>Replace & this</GivenName>
        <MiddleName>Replace < this</MiddleName>
    </PersonName>
    <Aliases>
        <PersonName>
            <GivenName>Replace > this</GivenName>
            <FamilyName>Replace " this</FamilyName>
        </PersonName>
    </Aliases>
    <DemographicDetail>
        <GovernmentId countryCode="US">testIDs data  </GovernmentId>
        <DateOfBirth>2000-12-12</DateOfBirth>
    </DemographicDetail>
</note>
<anothertag>
    <data type="credit">
        <Vendor score="yes"> vendor name  </Vendor>
    </data>
</anothertag>
</mainTag>';


$doc = new DOMDocument;
$doc->loadXML($xml);
$this->removeSpecialCharacterNodes($doc);
$xpath = new DOMXpath($doc);
$xml = $doc->saveXML($doc,LIBXML_NOEMPTYTAG);

替换以下内容

 & by &amp;
 > by &lt;
 < by &gt;
" by &quot;
' by  &apos;

我使用了以下递归代码,但返回空值

public function removeSpecialCharacterNodes(DOMNode $node) {
        // echo "aa";
        // var_dump($node->childNodes);
        $str = $node->childNodes;
        var_dump($node->childNodes);
        foreach ($node->childNodes as $child){
          if($child->hasChildNodes()) {
            $this->removeSpecialCharacterNodes($child);
          } else{
                $child->nodeValue = str_ireplace('&','&amp;',$child->nodeValue);
          }
        }    
    }

更新: 我已使用字符串replace和htmlspecialchars仍然是特殊字符的方式进行了更新。

$doc = new DOMDocument;
$doc->loadXML( $sampleXML);

foreach ($doc->documentElement->childNodes as $node) {
    if($node->nodeType==1){
        $oldAddressLine = $node->getElementsByTagName('AddressLine')->Item(0);
        // $elle = str_ireplace(
        //  array( "'"),//  array( "&apos;"),//  $oldAddressLine->nodeValue
        // );
        // $newelement = $doc->createElement('AddressLine',$elle); 
                
        $chk = $oldAddressLine->nodeValue;
        $newelement = $doc->createElement('AddressLine',htmlspecialchars( $chk,ENT_XML1 )); 

        if ($oldAddressLine->parentNode != null) {
           $oldAddressLine->parentNode->replaceChild($newelement,$oldAddressLine);
        }
    }
 }

 $xpath = new DOMXpath($doc);

 $finalVal = $doc->saveXML($doc,LIBXML_NOEMPTYTAG);

 echo "<pre>".htmlentities($finalVal)."</pre>"; exit;

解决方法

所谓的特殊字符必须是xml中的实体。为此,只需使用htmlspecialchars()对那些字符进行编码。

$value = htmlspecialchars( "Ben & Jerry 's",ENT_XML1 );
,

从PHP 5.4开始,您可以使用:

htmlspecialchars($ string,ENT_XML1); 您应该指定编码,例如:

htmlspecialchars($ string,ENT_XML1,'UTF-8'); 更新资料 请注意,上面只会转换:

&至&

至 如果要转义文本以在双引号中包含的属性中使用:

htmlspecialchars($ string,ENT_XML1 | ENT_COMPAT,'UTF-8'); 除了&,之外,还会将“转换为”。

如果您的属性用单引号引起来:

htmlspecialchars($ string,ENT_XML1 | ENT_QUOTES,'UTF-8'); 除了&,和“。”外,还会将'转换为'。

(当然,甚至可以在属性之外使用它。)

有关htmlspecialchars的信息,请参见手册条目。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-