你真的了解java的SAX解析么

问题描述

以前没做SAX这方面的不知道,现在仔细研究了下才发现,SAX解析是有缺陷的当我使用SAX解析器解析XHTML文件的时候,发现解析器无法正确的解析出文件当中的特殊字符,比如&iexcl;&cent;&pound;&curren;&yen;我debug了一下发现在继承自DefaultHandler的类中的characters方法中没有这些字符进来,而且还有一个现象是,一个标签中的所有字符会由&所在的特殊字符分成两部分。网上有人说SAX解析中会跳过这段带有&的字符,但是为什么&quot;----------------------------"&amp;----------------------------&&lt;----------------------------<&gt;---------------------------->这几个会转化为对应的普通字符显示,那么究竟是在SAX解析其中全部替换了,还是有什么其他原因呢,我找了下关于SAX解析方面的类源码,但是还是没找到具体原因.不知道各位大虾有什么思路或者解决方法么(在解析过程中不改变XHTML文件的前提下),希望大家不吝赐教,小弟不胜感激。

解决方案

解决方案二:
没注意过这个问题.不过你可以考虑换个XMLParser试试,也许只是你现在用的这个Parser的实现问题
解决方案三:
我测试下
解决方案四:
好像Dom解析也存在这个问题,而且Dom解析也不太满足我的要求
解决方案五:
我现在的想法是找到sax解析中作替换或者是跳过这些特殊字符的方法,然后自己来重构这些方法,但是死活没有找到,有没有高手指点下啊
解决方案六:
解析的时候,总有一些特殊字符,程序中用来做控制的,比如><,",我碰到的是<>需要转换,你就用转换的&lt;和&gt;代替好了,如果非要深究,找找源码看看,没这个必要,...........
解决方案七:
引用5楼wula0010的回复:

解析的时候,总有一些特殊字符,程序中用来做控制的,比如><,",我碰到的是<>需要转换,你就用转换的&amp;lt;和&amp;gt;代替好了,如果非要深究,找找源码看看,没这个必要,...........

现在是必须支持所有的准确的说是大部分的特殊字符,大概有两百多个,但是sax里面大部分替换掉成了空串"";使得我的解析显示大有问题
解决方案八:
&yen;这些不是XML中的实体引用,而是HTML中预定义的252个实体引用之一。XML中的实体引用只有5个,即:&lt;(<)、&gt;(>)、&quot;(")、&apos;(')、&amp;(&)
解决方案九:
W3CXML1.0PredefinedEntities
解决方案十:
好像Dom解析也存在这个问题,而且Dom解析也不太满足我的要求
解决方案十一:
引用8楼bao110908的回复:

W3CXML1.0PredefinedEntitieshttp://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent

这位老兄好像没看明白我的问题哦,现在用sax的话只能显示固定的几个,而其他的都被替换了,我是要将所有的特殊字符显示出来,看怎么解决
解决方案十二:
该回复于2011-03-15 13:37:23被版主删除
解决方案十三:
引用10楼muyu114的回复:

引用8楼bao110908的回复:W3CXML1.0PredefinedEntitieshttp://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent这位老兄好像没看明白我的问题哦,现在用sax的话只能显示固定的几个,而其他的都被替换了,我是要将所有的特殊字符显示出来,看怎么解决

我明白的,你说的那些没有一个XML解析器能支持的,你只能自己手工处理。
解决方案十四:
我前面也说了&yen;之类的是HTML的实体引用,并不是XML的,既然XML规范没有规定所以XML解析器没有理由会去支持。
解决方案十五:
自己手工处理吧哥们解析之前先把那些特殊字符用特殊标记标记上解析后在替换回来吧
解决方案:
http://blog.csdn.net/yaoweijq/archive/2010/11/09/5997153.aspx不清楚这个能否解决有点事情没有细看你的问题

时间: 2025-01-25 00:31:13

你真的了解java的SAX解析么的相关文章

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.6.1 使用SAX解析器

3.6.1 使用SAX解析器 SAX解析器在解析XML输入数据的各个组成部分时会报告事件,但不会以任何方式存储文档,而是由事件处理器建立相应的数据结构.实际上,DOM解析器是在SAX解析器的基础上构建的,它在接收到解析器事件时构建DOM树. 在使用SAX解析器时,需要一个处理器来为各种解析器事件定义事件动作.ContentHandler接口定义了若干个在解析文档时解析器会调用的回调方法.下面是最重要的几个: startElement和endElement在每当遇到起始或终止标签时调用. char

对象-这条android java语句真的很复杂,求解析

问题描述 这条android java语句真的很复杂,求解析 tripListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1,int position, long id) {Toast.makeText(ListViewExample2.this,"您选择的是" + list.get(position)

java解析XML之DOM解析和SAX解析(包含CDATA的问题)

Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都会调用相应方法,我们可以在这些

[Java开发之路](11)SAX解析XML文档

1. 简介 Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档: SAX采用事件驱动的方式解析XML.套用网友的解释:如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都

java中使用sax解析xml的解决方法_java

在java中,原生解析xml文档的方式有两种,分别是:Dom解析和Sax解析 Dom解析功能强大,可增删改查,操作时会将xml文档以文档对象的方式读取到内存中,因此适用于小文档 Sax解析是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档 本文主要讲解Sax解析,其余放在后面 Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取) 在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或

利用SAX解析读取XML文件

xml     这是我的第一个BLOG,今天在看<J2EE应用开发详解>一书,书中讲到XML编程,于是就按照书中的步骤自己测试了起来,可是怎么测试都不成功,后来自己查看了一遍源码,发现在读取XML文件的位置时有误,于是进行了更改,还真行了,心中涌出一中成就感,现将源码贴出来与给位分享: 使用XML文件连接MYSQL数据库,database.conf.xml文件如下: <database-conf><datasource> <driver>com.mysql.

[JAVA100例]069、使用SAX解析XML

ReadXmlDemo.java import java.io.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; public class ReadXmlDemo extends DefaultHandler { public static void main(String[] arguments) { if (arguments.length > 0){ ReadXmlDemo

SAX解析XML文件

就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方式便于对XML节点的添加修改等,而且解析也很方便,然后它比较耗费内存,解析速度也不快.SAX则是基于事件的解析,解析器在一次读取XML文件中根据读取的数据产生相应的事件,由应用程序实现相应的事件处理逻辑,即它是一种"推"的解析方式:这种解析方法速度快.占用内存少,但是它需要应用程序自己处理

java-求助SAX解析XML时为什么不加上stack.pop()无法打印出元素文本内容?

问题描述 求助SAX解析XML时为什么不加上stack.pop()无法打印出元素文本内容? package com.shengsiyuan.xml.sax; import java.io.File; import java.util.Stack; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.s