之前为项目赶进度用php 的simplexml来解析 xml, 当时发现 simplexml不支持<![CDATA标签, 所有处于这个标签内的值都没有办法取到。

当时在网上找了一个CDATA的转换器, 修改之后, 将CDATA标签给过滤掉。如下

// States: // // 'out' // '<' // '<!' // '<![' // '<![C' // '<![CD' // '<![CDAT' // '<![CDATA' // 'in' // ']' // ']]' // // (Yes, the states a represented by strings.) // $state = 'out'; $a = str_split($xml); $new_xml = ''; foreach ($a AS $k => $v) { // Deal with "state". switch ( $state ) { case 'out': if ( '<' == $v ) { $state = $v; } else { $new_xml .= $v; } break; case '<': if ( '!' == $v ) { $state = $state . $v; } else { $new_xml .= $state . $v; $state = 'out'; } break; case '<!': if ( '[' == $v ) { $state = $state . $v; } else { $new_xml .= $state . $v; $state = 'out'; } break; case '<![': if ( 'C' == $v ) { $state = $state . $v; } else { $new_xml .= $state . $v; $state = 'out'; } break; case '<![C': if ( 'D' == $v ) { $state = $state . $v; } else { $new_xml .= $state . $v; $state = 'out'; } break; case '<![CD': if ( 'A' == $v ) { $state = $state . $v; } else { $new_xml .= $state . $v; $state = 'out'; } break; case '<![CDA': if ( 'T' == $v ) { $state = $state . $v; } else { $new_xml .= $state . $v; $state = 'out'; } break; case '<![CDAT': if ( 'A' == $v ) { $state = $state . $v; } else { $new_xml .= $state . $v; $state = 'out'; } break; case '<![CDATA': if ( '[' == $v ) { $cdata = ''; $state = 'in'; } else { $new_xml .= $state . $v; $state = 'out'; } break; case 'in': if ( ']' == $v ) { $state = $v; } else { $cdata .= $v; } break; case ']': if ( ']' == $v ) { $state = $state . $v; } else { $cdata .= $state . $v; $state = 'in'; } break; case ']]': if ( '>' == $v ) { $new_xml .= htmlentities($cdata); # $new_xml.= $cdata; // $new_xml .= str_replace('>','>', // str_replace('>','<', // str_replace('"','"', // str_replace('&','&', // $cdata)))); $state = 'out'; } else { $cdata .= $state . $v; $state = 'in'; } break; } // switch } // // Return. // return $new_xml;

最近发现,总是有alert发出来, 说是simplexml解析出错。

发现是原来有xml的数据是<![CDATA[domain[test]]] >. 出现了连续的3个], 造成上面的解析函数不能处理。

而且这个问题很难修正, 你不知道下次会不会有4, 5个]出现。

所以决定还是将这段解析 的代码换成DOM XML,本身 DOM的处理还是比较简单的,

包含DOMElement, DOMDocument, DOMNodeList, DOMNode几个 component.

对于 DOMNode有nodeValue, nodeType, nodeName的成员函数。

首先先用loadXML将string转化为DOMDocument对像, 再用getElementsByTagName转化为DOMNodeList对像, 再使用->item(0)转化为DOMNOde, 然后就可以使用上面的三种方法了。

对于 <aa color='red'>test</aa>这种xml标签, 要使用 attribute函数。

PHP cdata 处理相关推荐

  1. mybatis中![CDATA[]]的作用

    此篇文章引自QH_JAVA的文章 在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用 ...

  2. XML 特殊字符处理和 CDATA

    在处理XML数据时,特殊字符要特殊处理,不能和节点字符混淆. 所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA ...

  3. asp.net webapi 序列化为xml 时实体属性增加![CDATA[]]防止特殊字符

    有时webapi在序列化xml时,可能需要给某些带有html或特殊字符(如 < > & /)的字段加上<![CDATA[]]> 已防止影响xml正常数据,如果使用.as ...

  4. XML CDATA概述

    XML 文档中的所有文本均会被解析器解析.只有 CDATA 区段中的文本会被解析器忽略. PCDATA - 被解析的字符数据 XML 解析器通常会解析 XML 文档中所有的文本. 当某个 XML 元素 ...

  5. R语言将dataframe数据从宽表(wide)变为长表(long)实战:tidyr包的gather函数、cdata包的unpivot_to_blocks函数、data.table使用melt函数

    R语言将dataframe数据从宽表(wide)变为长表(long)实战:tidyr包的gather函数.cdata包的unpivot_to_blocks函数.data.table使用melt函数 目 ...

  6. XML中CDATA及其字符实体的使用

    在写xml文档时,偶尔会用到一些特殊字符,如<.>.&等,如下面这段程序: <?xml version="1.0"?> <y>if x& ...

  7. 1.spring:helloword/注入/CDATA使用/其他Bean/null级联/p命名空间

    新建工程,导入jar,添加spring配置文件(配置文件xxxx.xml)! 1.Helloword实现 Helloword.java public class HelloWord {private ...

  8. matlab scatter cdata,matlab cdatamapping

    (x,y,z,'Cdata',flipud(c1),'FaceColor','texturemap',... 'EdgeColor','none','CDataMapping','direct','A ...

  9. XML中的CDATA是什么

    XML 解析器通常情况下会处理XML文档中的所有文本. 当XML元素被解析的时候,XML元素内部的文本也会被解析: <!--<br/ /><br/ />Code high ...

  10. mapper中的CDATA标签的用法

    术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data). 在 XML 元素中,"<" 和 "&& ...

最新文章

  1. Bowtie下载安装
  2. git常用命令之stash
  3. 什么是Shell,Shell教程
  4. struct __POSITION{}和ASSERT
  5. java一般做什么_java开发一般做什么
  6. mysql sum函数返回类型_MySQL的sum函数返回的门类
  7. CCF NOI1007 计算余数
  8. Android 两个App间进行IPC通信
  9. hiho一下 第173周
  10. 腾讯专访 | 子芽:代码疫苗技术,赋能数字化应用内生安全自免疫
  11. CAD如何完成10以上带圈序号的输入?
  12. 魅族手机android调试模式吗,怎么开启魅族Pro5 USB调试模式 魅族Pro5 USB调试模式开启方法...
  13. 身份证前6位匹配户籍地址对应的数据地区sql脚本(里面包含json版本的)
  14. pyqt5在图元上画图_PyQt5的PyQtGraph实践系列1:添加图形到PyQt5布局
  15. 微星B550M迫击炮,设备管理器 声卡不显示Realtek解决办法
  16. WinSnap 截图工具绿色中文特别版
  17. 生物信息学_测序技术(一)DNA测序
  18. pkusc 2018 滚粗
  19. 遇到的一个网页排版问题
  20. Credential Harvester的脚本修改

热门文章

  1. 操作系统概念_第六章_进程同步
  2. 微信小程序提交上线时 定位接口提示未配置
  3. python爬虫之爬取网页基础知识及环境配置概括
  4. 基于浏览器的http普通请求与ajax请求
  5. yolov7 打开深度摄像头 realsences
  6. DP的一些杂题(思维型)
  7. 浅入浅出 1.7和1.8的 HashMap
  8. 杰理AC692X学习-BLE与APP端发送与接收
  9. 【cocos2d-x从c++到js】22:使用非侵入方式扩展UI系统接口的举例
  10. 星之卡比机器人汉化_星之卡比:机械星球