java cdata类,分析XML中的CDATA类型在RSS中的使用
除经特别注明外,本站文章版权归JScud Develop团队或其原作者所有.
转载请注明作者和来源. scud(飞云小侠) 欢迎访问 JScud Develop
根据XML中CDATA类型的规范可以知道:"&"和"" 如果出现在"]]>" 的内容而不是表示结束时,必须被转义为>
但是这样就存在一个问题,如果我需要输入"]]>",正确的处理是保存为"]]>",但是如果我想输入"]]>",那么应该如何保存哪? 我想了很久,除非加空格或者采用特殊的办法,否则是没有办法解决的.
1.如果我们不考虑输入"]]>"的问题,来考虑一下"]]>"的处理,看看各种XML解析器是如何处理的?
xml解析器的测试包含2个部分:设置cdata类型的数据和读出cdata类型的数据.
首先我们写一个测试的例子,计划使用JDom 1.0和Dom4j来测试一下:
package com.jscud.test;
public class XmlTestBase
{
public static String xmlpart =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+
"" +
""+
"" +
"" +
"";
public static void print(String str)
{
System.out.println(str);
}
}
JDom测试的例子如下:
package com.jscud.test;
import java.io.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.output.*;
//@author scud http://www.jscud.com
public class JDomXmlFileTest extends XmlTestBase
{
public static void main(String[] args) throws Exception
{
readDocument();
print("===========================");
createDocument();
}
public static void readDocument() throws Exception
{
Reader reader = new StringReader(xmlpart);
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(reader);
Element aRoot = doc.getRootElement();
Element anode = aRoot.getChild("test").getChild("hello");
print(anode.getText());
}
public static void createDocument() throws Exception
{
Document doc = new Document();
doc.setRootElement(new Element("root"));
CDATA node = new CDATA("hello alt=]]>");
//throw Exception
//node.setText("hello]]>");
Element ele = new Element("hello");
ele.setContent(node);
Element root = doc.getRootElement();
root.getChildren().add(ele);
XMLOutputter outputter = new XMLOutputter();
Format aFormat = Format.getCompactFormat();
aFormat.setEncoding("GB2312");
String sResult = outputter.outputString(doc.getRootElement().getChildren());
print(sResult);
}
}
编译并运行上面的代码结果,我们可以看到JDom无法设置Cdata的值为"]]>",会报异常.从xml字符串读出cdata的结果也没有把字串"]]>"翻译为"]]>".
接着再来测试Dom4J:
package com.xml.test;
import java.io.StringReader;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.dom4j.tree.DefaultCDATA;
/**
* 测试XML的CData数据类型.
*
* @author scud http://www.jscud.com
*
*/
public class Dom4jXmlTest extends XmlTestBase
{
public static void main(String[] args) throws Exception
{
readDocument();
print("===========================");
createDocument();
}
public static void createDocument()
{
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
DefaultCDATA cdata = new DefaultCDATA("sample]]>");
DefaultCDATA cdata2 = new DefaultCDATA("sample]]>");
Element anode = root.addElement("cdata");
anode.add(cdata);
print(anode.getText());
print(anode.asXML());
Element anode2 = root.addElement("cdata2");
anode2.add(cdata2);
print(anode2.getText());
print(anode2.asXML());
}
public static void readDocument() throws Exception
{
StringReader strreader = new StringReader(xmlpart);
SAXReader reader = new SAXReader();
Document document = reader.read(strreader);
Node node = document.selectSingleNode( "//test/hello" );
print(node.getText());
print(node.getStringValue());
}
}
我们可以看到Dom4j也是没有做任何处理,输入的时候不作任何转换,原样输出,这样必然导致xml错误.读出的时候也没有做转换.
根据上面的测试我们可以得出结论:很多xml解析器没有正确解析cdata的数据,(jdom和dom4j用的人比较多),不要太相信这些解析器.
2.我们再来看看阅读RSS的RSS阅读器吧,例如FeedDemon和POTU,我们准备了一个CData类型的description字段,来进行测试.
内容:
Some Where
http://www.jscud.com/
Test
http://www.jscud.com
scud
Mon, 22 Aug 2005 10:22:22 GMT
<hr>
]]>
]]>
结果:
1.POTU没有做任何处理
2.FeedDemon做了处理,不过同时也把其他的> <等等都翻译了,这就更不对了..
本来我是打算在RSS里使用CDATA类型的description字段的,经过几番试验和测试,最后决定还是使用普通的description字段了,不在使用CDATA了.
CDATA? 鸡肋乎? 呵呵
posted on 2005-08-22 18:49 Scud(飞云小侠) 阅读(2515) 评论(0) 编辑 收藏 所属分类: Java
java cdata类,分析XML中的CDATA类型在RSS中的使用相关推荐
- Xml转Java实体类对象 xml转Javabena 对象 且多级嵌套 复杂嵌套
最近在做企微开发,遇到了一个比较复杂的xml然后要去我将xml转成实体类 xml如下 <xml><ToUserName><![CDATA[toUser]]>< ...
- php 添加cdata,php生成xml时添加CDATA标签的方法
php生成xml时添加CDATA标签的方法 发布于 2014-12-14 17:18:59 | 210 次阅读 | 评论: 0 | 来源: 网友投递 XML可扩展标记语言xml 即 可扩展标记语言 . ...
- php cdata,php生成xml时添加CDATA标签
php生成xml时添加CDATA标签方法非常的简单,因为是一个在xml中可以存储各种内容的标签了,下面整理了一个例子希望对各位有帮助. 贴上代码留住伤疤,不要把当成前后缀,其实它可以是标签,代码如下: ...
- mysql数据库中常用的类型_MySQL数据库中常用字段类型
MySQL数据库中常用字段类型 整数型:TINYINT,SMALLINT,INT,BIGINT 小数型:FLOAT,DOUBLE,DECIMAL(M,D) 字符型:CHAR,VARCHAR 日期型:D ...
- java测试类读取不到配置文件_java – 如何在单元测试中读取配置文件?
我有一个标准的maven项目布局. 一些配置文件存储在src / main / conf中. 现在我想在src / test中的单元测试中读取这些文件(例如,从其中一个文件中读取属性). 我怎么能完全 ...
- php rss xml,php – 如何使用simplexml解析RSS中的标记
http://www.cnn.com/intl_index.html ... http://www.cnn.com/2017/01/11/politics/russia-rejects-trump-a ...
- 凡是函数中未指定存储类型_函数中未指定存储类别的局部变量,其隐含的存储类别为()...
展开全部 函数中未指定存储类别的局部变量,其隐含的存储类别为自动存32313133353236313431303231363533e59b9ee7ad9431333431353338储类别. 函数中的 ...
- Java的4种XML解析
在平时工作中,难免会遇到把 XML 作为数据存储格式.面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML ...
- MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结
在此,首先说明一点任何持久性框架都需要解决一个问题,那就是Java实体类的字段一般来说基本上会与数据库表中字段不一致,那么它们是如何解决的呢?咱们以Hibernate和SpringJDBC为例说明一下 ...
最新文章
- 【AI面试题】逻辑回归和线性回归的区别
- outlook搜索栏跑到上面去了_Outlook邮箱批量下载邮件附件+快速复制文件名
- 软件工程知识点总结(含各类软件工程各类图的画法)
- centos 7.6上面安装向日葵远程连接软件
- ColdFusion mx 7.0 函数分类列表
- python中iter是什么意思,python中iter的用途是什么?
- 启动Nginx时报错:error while loading shared libraries: librdkafka.so.1: cannot open shared object file: No
- 3rd TMA大数据营销案例征集赛正式启动,报名ing!
- 云会议是什么?如何提升云会议的协同能力?
- 使用css画太极,CSS画太极阴阳图
- ubuntu20.04下安装微信和qq
- 《清华园日记》读后感
- soso地图api接口poi检索示例----并在信息框显示经纬度
- c语言中do是什么用法,C语言基础知识:do while用法理解
- 安搭Share:小康时代新青年
- 软件测试-测试历史/职业发展
- 免费!iPhone北京用户大好消息:果粉欢呼/资源修复网易漫画,以上为今日内容...
- 微信接口连接和简单自动回复功能
- 分支限界——最大团问题
- ajax特殊字符转码,AJAX在GB2312的中文编码传输 AJAX特殊字符编码正确方法
热门文章
- linux修改分辨率的命令,linux更改分辨率命令行
- 文献阅读(24)KDD2020-GCC:Graph Contrastive Coding for Graph Neural Network Pre-Training
- PHP常用正则表达式汇总
- EasyExcel 集成国际化实现导入导出
- (Visual Navigation)点云转地图信息
- vue3 + ts + vite3 使用 腾讯地图api
- 新品亮相丨美格智能高性能Cat.1 bis模组SLM332X上市
- 【进阶版】机器学习之集成学习介绍、随机森林模型经验贴(12)
- 虚幻引擎(15)-暂停游戏
- php ajax传悚惧,错惹恶魔总裁