泥嚎泥嚎 亲网络剧河神百度云资源的百度资源

版权声明:
欢迎转载,但请保留文章原始出处
什么时候可以把解析值赋给对象
一般从网上看到的sax解析,都是在Handler中的characters方法进行对象数据的赋值。
示例代码如下:
private TransportFile parseXML(String xml) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
SAXParser saxparser = saxfac.newSAXParser();
InputStream is = new ByteArrayInputStream(xml.getBytes());
MySAXHandler handler = new MySAXHandler();
saxparser.parse(is, handler);
return handler.getData();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
return null;
private class MySAXHandler extends DefaultHandler{
String currentTagName = &&;
TransportFile mData = null ;
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTagName = qN
if(&file&.equals(qName)){
mData = new TransportFile();
public void characters(char[] ch, int start, int length)
throws SAXException {
String str = new String(ch,start,length);
if(&guid&.equals(currentTagName)){
mData.guid =
}else if(&name&.equals(currentTagName)){
mData.name =
}else if(&type&.equals(currentTagName)){
mData.type =
}else if(&length&.equals(currentTagName)){
mData.length = Long.parseLong(str);
}else if(&index&.equals(currentTagName)){
mData.index = Integer.parseInt(str);
}else if(&count&.equals(currentTagName)){
mData.count = Integer.parseInt(str);
}else if(&data&.equals(currentTagName)){
mData.data = Base64.decode(str);
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentTagName = &&;
public TransportFile getData(){
普通的使用场景中上述代码没有问题,但是当xml中某一标签的内容很长时,就会引发上述代码的bug。
实践发现sax解析每次也就解析1k左右的数据,超出部分其实是要分段多次解析的。
所以问题来了,如果在characters方法中解析,那么其他几段的数据仍然会不断覆盖最终返回对象中的数据,导致数据丢失。
因此,对于赋值给最终传回对象的数据,在characters阶段只能不断拼接,解析必须在endElement时才可以完成。否则当数据内容比较大的时候,网上代码中的bug就会凸显出来。
顺便贴上我的代码:
private class MySAXHandler extends DefaultHandler{
String currentTagName = &&;
TransportFile mData = null ;
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTagName = qN
mStringBuilder = new StringBuilder();
if(&file&.equals(qName)){
mData = new TransportFile();
private StringBuilder mStringB
public void characters(char[] ch, int start, int length)
throws SAXException {
mStringBuilder.append(ch, start, length);
public void endElement(String uri, String localName, String qName)
throws SAXException {
String str = mStringBuilder.toString();
if(&guid&.equals(currentTagName)){
mData.guid =
}else if(&name&.equals(currentTagName)){
mData.name =
}else if(&type&.equals(currentTagName)){
mData.type =
}else if(&length&.equals(currentTagName)){
mData.length = Long.parseLong(str);
}else if(&index&.equals(currentTagName)){
mData.index = Integer.parseInt(str);
}else if(&count&.equals(currentTagName)){
mData.count = Integer.parseInt(str);
}else if(&data&.equals(currentTagName)){
mData.data = Base64.decode(str);
currentTagName = &&;
public TransportFile getData(){
characters方法参数注意
ch是当前解析到的字符数组,并不是精确的标签内的内容。
下面是解析第一个标签时characters中 ch 、 start、length输出:
===========characters ch: &?xml version='1.0' encoding='utf-8' standalone='yes' ?&&file&&guid&678c6f92-d617-40af-bb87-a80c3b2be91f&/guid&&name&0CAQLTZGO.jpg&/name&&type&image&/type&&length&71374&/length&&index&0&/index&&count&1&/count&&data&/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoK.....
===========characters start:31
===========characters length:36
真正当前需要的数据是ch数组从start开始的length个字符。
阅读(...) 评论()xml配置文件中特殊字符的处理 - 简书
xml配置文件中特殊字符的处理
在项目开发中,使用到了ibatis作为项目的数据库访问持久层。在sqlmap的XML配置文件中编写一条SQL语句时,遇到这样的问题:where条件中包括了判断出生日期在某一段时间内。
刚开始我是这么写的
&isNotEmpty property="ageBeginTime" prepend=" and "&
A.CSRQ&=#ageBeginTime#
&/isNotEmpty&
&isNotEmpty property="ageEndTime" prepend=" and "&
A.CSRQ&=#ageEndTime#
&/isNotEmpty&
此时IDE就报出了配置出错的信息
通过查阅资料,明白是判断条件中的大于&和小于&出错,它会使XML解析器产生混淆。也就像JSON格式中出现双引号会使得格式出错的场景。那么解决办法,也就是对大于和小于进行转义,将大于号&改为&、小于号&改为&
另外在查阅资料中,在看别人写的SQL中,使用到的是下面这种方法来防止特殊字符的。
&isNotEmpty property="ageBeginTime" prepend=" and "&
&![CDATA[ A.CSRQ&=#ageBeginTime# ]]&
&/isNotEmpty&
&isNotEmpty property="ageEndTime" prepend=" and "&
&![CDATA[ A.CSRQ&=#ageEndTime# ]]&
&/isNotEmpty&
通过&![CDATA[条件值]]&来解决此问题。当时没有深究,也就这么用了。后来今天在一本书看到了关于此问题更详细的描述。
在XML中有5个特殊的字段,分别是: & & & " '。如果XML配置文件中的注入值包括这一些特殊字符的话,就需要特别的处理。处理方式有两种:1、使用&![CDATA[]]&这个标签将包括特殊字符的注入值封装起来2、使用XML转义序列表示这些特殊字符
五个符号的转义序列如下:
小于号&对应的是&
大于号&对应的是&
联结符&对应的是&
双引号"对应的是&
单引号'对应的是&
在MarkDown中为防止&被直接解析成了;,可以采用`符号将其包裹起来。
code and lifexml 的特殊字符的处理方法
字体:[ ] 类型:转载 时间:
在xml中,有一些符号作为XML 的标记符号,一些特定情况下,属性值必须带有这些特殊符号。 下面主要是讲解一些常用的特殊符号的处理
遇到这一方面的问题是因为我试图把一个对象序列化之后存贮到xml文件中,然后从xml文件中读取字符串,并反序列化对象(hadoop mapreduce程序中通过JobConf向tasktracker传送对象)。
有关序列化:
当我把序列化之后的数据直接存在xml中后,在解析xml时遇到解析错误,原因是有非法字符。在详细阅读xml的说明之后才发现:& & ' " &是不允许作为xml的PCDATA的。要使用这几个字符,必须要把他们替换为内建实体:
实体引用& 字符
所以,最直接的方法就是自己控制,在写入xml文件时把特殊字符转为实体引用,在读取的时候,再转回来。当然还有另外一个方法就是不把字符串当PCDATA,而是当成CDATA来使用(没有测试)。
&用实体引用的方法太麻烦,而我的应用xml的格式不能自己规定,所以只好寻找另外的方法:BASE64编码。这是一种常用在网络传输数据的编码方式。把存在这些非法字符的字符编码成base64编码,就不会有这些字符了。最重要的是java api中提供了这种编码的编码器和解码器,位于sun.misc的BASE64Encoder和BASE64Decoder。这样就可以把序列化之后得到的字节流转化成字符串了。并且也可以存贮在xml文件中。
不过这两个类并不是sun的开放api,编译会有警告。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 河神百度云资源 的文章

 

随机推荐