之前为项目赶进度用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函数