php

位置:IT落伍者 >> php >> 浏览文章

PHP cdata 处理(详细介绍)


发布日期:2019年06月12日
 
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]]] > 出现了连续的个] 造成上面的解析函数不能处理

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

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

包含DOMElement DOMDocument DOMNodeList DOMNode几个 component

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

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

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

               

上一篇:php记录代码执行时间(实现代码)

下一篇:js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析