xml格式异常-CDATA嵌套

来源:互联网 发布:监控硬盘覆盖数据恢复 编辑:程序博客网 时间:2024/06/05 21:10

在CDATA内部的所有内容都会被解析器忽略。一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束。但是要记住,CDATA是不能够嵌套的。但是现在,就是有人要求实现CDATA的嵌套。

比如,将下面这段XML加到另外一个XML的某个元素里面:

<?xml version="1.0" encoding="UTF-8" ?>
<System><id>library</id>
<name>Library Management</name>
<description><![CDATA[This is a sample library management subsystem for Signet.]]></description>
<Categories>
<System/>

将内部的CDATA的结尾转义?那就变成了"<![CDATA[" 和"]]>amp;",这样不好吧,老师说,接收XML的那一方怎么会知道你在里面加上了转义?

那么,可以把CDATA的结尾的"]]>"破坏掉,把它分到两个CDATA中,然后调用Java的API读取该元素的数据时,实际上API同时读取两个CDATA块,然后合成一个。

那么,把上面的XML作为一个字符串来处理,将"]]>"替换为"]]]]><![CDATA[",千万要记住,不要包含空格进去。这样,结果应该是

<?xml version="1.0" encoding="UTF-8"?>
<Messages>
<Message type="data">
<code>1199242678515-176590595</code>
<date>2008/01/02</date>
<time>10:57:58</time>
<content><![CDATA[<?xml version="1.0" encoding="UTF-8" ?>
<System><id>library</id>
<name>Library Management</name>
<description><![CDATA[This is a sample library management subsystem for Signet.]]]]><![CDATA[></description>
<Categories>
<System/>]]></content>
</Message>

</Messages>

这样,利用Object org.dom4j.Element.getData()方法得到的数据才是原始的XML片段。


CDATA 在xml中使用比较频繁,当我们在给节点的值中有特殊字符时,就需要把值用CDATA括起来,这样就不解析里面的内容了。但是当遇到里面的值中已有CDATA时就出错了。它是不允许嵌套的。今天在使用soapUI时,发现它展示的xml中成功的使用了CDATA嵌套,自己写了个程序试了下,果然管用。
代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package test;
import java.io.StringReader;
import org.jdom.*;
import org.jdom.output.*;
import org.jdom.input.*;
/**
 *
 * @author Administrator
 */
public class CDATATest {
 
    /** Creates a new instance of CDATATest */
    public CDATATest() {
    }
    public static void main(String[] args){
        SAXBuilder saxb=new SAXBuilder();
        Document doc= null;
        Element element,childelement;
        StringReader strreader= null;
        Attribute attribute=null;
         String xml="<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
                "<catalogs>" +
                "<catalog1>" +
                "<![CDATA[<?xml version=\"1.0\" encoding=\"UTF-8\"?><Request><Data><![CDATA[x>0]]]]>><![CDATA[</Data></Request>]]>" +
                "</catalog1>" +
                "</catalogs>";//中间的"]]>"替换成了"]]]]>><![CDATA["
        try{
            strreader=new StringReader(xml);
            doc=saxb.build(strreader);
            element=doc.getRootElement();
            System.out.println("catalog1的值:"+element.getChildText("catalog1"));
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 b2驾照实习证扣6分怎么办 健身房有个教练想撩我怎么办 学车跟校长投诉了教练怎么办 打架把眼睛打肿怎么办属于什么伤 罗马椅有点高做不了山羊挺身怎么办 节食一周后暴食肚子胀的难受怎么办 健身教练和会员聊天说错肌肉怎么办 两个月宝宝吃奶老是呛到怎么办 怀孕六个月体重一天增加两斤怎么办 备孕同房后一直乳头立起来怎么办 夏天出汉内衣老是湿的怎么办 大腿旁边长了红色的癣怎么办 跑步膝盖疼怎么办能不能再跑了 两周宝宝剧烈运动后咳嗽怎么办 bra的M有点紧L有点宽怎么办 穿吊带总是会露出来左胸罩杯怎么办 生小孩后腰部有一圈黑色勒痕怎么办 新买的饮水机热水口出水小怎么办 新买的饮水机热水口不出水怎么办 平胸没有适合自己的内衣怎么办 售楼小姐穿坏的丝袜都怎么办了 蛋白粉一天喝十克补不起来怎么办 跑步时没有卸妆毛孔堵塞了怎么办 自己做的葡萄酒太甜了怎么办 健身馆碰到一个帅的健身教练怎么办 随着年龄的增长脖子越来越短怎么办 安装软件时解析包出现问题怎么办 鼻子吸进去的气往嘴巴里怎么办 做完瑜伽之后大腿后侧特别紧怎么办 刚下生小狗腿后腿站不起来怎么办 脚被凳子压到了流血了怎么办还很痛 小狗脚被凳子压出血了怎么办 怀孕8个月脐带绕颈一周怎么办 练完瑜伽大腿两侧肌肉麻木怎么办 突然吃了辣火锅肚子烫怎么办 副鼻窦炎鼻头顶痛鼻子臭怎么办 一岁宝宝夜里睡觉不踏实怎么办 分手一个月了还是放不下前任怎么办 当晚上遇到烦心事睡不着该怎么办 为什么白天太累晚上就睡不着怎么办 白天走累的脚痛晚上睡不着怎么办