PHP cdata 处理
之前为项目赶进度用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 处理相关推荐
- mybatis中![CDATA[]]的作用
此篇文章引自QH_JAVA的文章 在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用 ...
- XML 特殊字符处理和 CDATA
在处理XML数据时,特殊字符要特殊处理,不能和节点字符混淆. 所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA ...
- asp.net webapi 序列化为xml 时实体属性增加![CDATA[]]防止特殊字符
有时webapi在序列化xml时,可能需要给某些带有html或特殊字符(如 < > & /)的字段加上<![CDATA[]]> 已防止影响xml正常数据,如果使用.as ...
- XML CDATA概述
XML 文档中的所有文本均会被解析器解析.只有 CDATA 区段中的文本会被解析器忽略. PCDATA - 被解析的字符数据 XML 解析器通常会解析 XML 文档中所有的文本. 当某个 XML 元素 ...
- 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函数 目 ...
- XML中CDATA及其字符实体的使用
在写xml文档时,偶尔会用到一些特殊字符,如<.>.&等,如下面这段程序: <?xml version="1.0"?> <y>if x& ...
- 1.spring:helloword/注入/CDATA使用/其他Bean/null级联/p命名空间
新建工程,导入jar,添加spring配置文件(配置文件xxxx.xml)! 1.Helloword实现 Helloword.java public class HelloWord {private ...
- matlab scatter cdata,matlab cdatamapping
(x,y,z,'Cdata',flipud(c1),'FaceColor','texturemap',... 'EdgeColor','none','CDataMapping','direct','A ...
- XML中的CDATA是什么
XML 解析器通常情况下会处理XML文档中的所有文本. 当XML元素被解析的时候,XML元素内部的文本也会被解析: <!--<br/ /><br/ />Code high ...
- mapper中的CDATA标签的用法
术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data). 在 XML 元素中,"<" 和 "&& ...
最新文章
- android区块链 钱包_区块链研究实验室|从Android调用区块链智能合约
- Access restriction: The type Unsafe is not accessible due to restriction on required library
- c 语言三种正规循环,C语言复习题库
- golang常见字符串操作函数
- CF1592D Hemose in ICPC ?
- 【JS 逆向百例】DOM 事件断点调试,某商盟登录逆向
- codeblocks安装后提示找不到编译器
- 实战经验:如何定位控制文件热点块,即读取延迟高的块所在的ASM磁盘
- Flask模板参数传值的方法
- 一分钟了解阿里云产品:安骑士
- Facebook内布拉斯加州数据中心将扩建100万平方英尺
- 路由器需要多大内存?
- 基于SSM框架的新闻管理系统
- wsdl2java 工具_apache CXF wsdl2java工具的使用
- 安装moodle3.6
- arcgis重分类工具详解——结合遥感影像中植被剔除实例
- android 删除系统服务,不ROOT卸载系统自带应用
- བྱ་དེ་ཁྲུང་ཁྲུང་དཀར་པོ།།--洁白的仙鹤/仓央嘉措情歌--IPA--藏语...
- could和may区别请求_英语教学:外教这样区分can,may,could
- C语言编程>第十周 ⑦ 请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行……