`
xinklabi
  • 浏览: 1591617 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

SAX解析含特殊字符的xml文档(java)

 
阅读更多

 

       

 

一、不含自定义字符或含较少量的特殊字符

 

一般的特殊字符有五个:&<,>,’(单引号),”(双引号)。这些字符如果直接出现在xml文档中,一般是不能解析出来的,如解析<example>a&b<example>时会报错。解决方法有两个:1.<![CDATA[ ]]>标记;2.转义。

 

1.  <![CDATA[ ]]>标记

 

对于含特殊字符的element<![CDATA[ ]]>标记起来即可成功解析,如<example><![CDATA[a&b]]><example>

 

该方法简单但不实用,对于每个含特殊字符的element都要用<![CDATA[ ]]>标记。数量很少是推荐用这种方法。

 

2.  转义

 

特殊字符数量很多时方法1显然不实用,此时可用转义来实现:

 

&lt; < 小于号

 

&gt; > 大于号

 

&amp; &

 

&apos; ' 单引号

 

&quot; " 双引号

 

即将xml中的特殊文档全部替换为转义字符,如<example>a&b<example>变成<example>a&amp;b<example>

 

但是对于这种情况解析过程会发生变化,不是一次性解析a&b,而是分三步,先解析a,然后是&,然后是b,因此要注意想要获得<example>中数据必须要用String变量将这三部分加起来。即解析程序中

 StringBuffer contentBuffer = new StringBuffer();

public void characters(char[] ch, int start, int length)

 

            throws SAXException {

 

        if(this.tagName!=null){

                                contentBuffer.append(ch, start, length);//当出现特殊字符时会循环调用当前方法,若想使字符串完整解析,使用StringBuffer更好一点,否则只使用String的话只会得到末尾的部分字符串。

            //String date=new String(ch,start,length);

 

            //date就是当前节点(tagName)解析出来的数据

 

            //example=example+date;

 

//example是已申明的用来存储<example>中数据的Sting变量

 

}

 

}

 

这样解析出的example变量才是a&b,如果直接用example=date;得到的example的变量的只是b

 

二、含自定义字符或含较多的特殊字符(用dtd文件验证)

 

DTD文件格式及验证xml原理(百度)

 

如何解析含DTDxml文件呢?

 

dtd文件导入当前工程,在xml文件中加入

 

<!DOCTYPE xml文件名 SYSTEM "src/dblp.dtd">即可。

 

如解析<example>a&uuml;b<example>,在dtd文件中声明

 

<!ENTITY uuml "&#252;"><!-- small u, dieresis or umlaut mark --> 验证&uuml;代表字符ü

 

三、含单引号的xml解析后插入数据库:

 

用上面方法可以解析出xml中含单引号的数据(String型数据),但要将数据插入数据库中却很容易出现问题,因为sql语句中不允许单独的单引号存在,解决办法很简单,将解析所得的数据中的单引号用函数replaceAll()替换成双引号在插入数据库即可。

 

四、解析含较多实体引用的大型的xml文档(如1G

 

xml实体引用都是以&开头,以;结尾,如第二大点中的&uuml;就是一个实体引用。对于大型的xml文档,含有的实体引用可能太多导致解析过程报错:Parser has reached the entity expansion limit "64,000" set by the Application.

 

即单个xml文件中实体引用超过了默认值64000个。这时只要在解析前设置单个xml文件中实体引用的最大数量即可,System.setProperty("entityExpansionLimit", "xxxxx");xxxxx代表设定的单文件实体引用数最大值。

 

分享到:
评论

相关推荐

    Sax解析XML文件解析

    SAX解析器以流式的方式读取XML文档,当遇到文档的各个元素时,会触发相应的事件,如开始文档、开始元素、结束元素、字符数据等。程序员通过实现SAX解析器的回调接口来处理这些事件,从而解析XML内容。这种方式使得...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    2. **SAX解析**:SAX是一种事件驱动的解析方式,它逐行读取XML文档,遇到元素、属性等时触发相应的事件处理器。这种方式节省内存,适合处理大型XML文件。"sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析...

    java解析xml数据---sax解析器

    SAX解析的基本工作原理是通过事件处理器(如ContentHandler、EntityResolver等)来接收XML文档的解析事件,如开始文档、结束文档、开始元素、结束元素、字符数据等。当解析器遇到这些事件时,会调用相应的处理器方法...

    Servlet利用SAX解析XML文档

    本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 首先,我们需要了解SAX解析的基本原理。SAX解析器不创建整个XML文档树,而是当遇到XML文档的各个部分(如元素、属性、文本等)时,触发相应的事件回调函数。...

    sax解析xml本地读取xml

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...

    解析XML特殊字符方法

    XML解析器在读取XML文档时会自动处理特殊字符。如果解析器发现未转义的特殊字符,它会抛出错误,因为这可能表示XML文档格式不正确。确保正确编码特殊字符是防止解析错误的关键。 **4. CDATA区** 除了实体引用,XML...

    sax解析xml尤其是获取元素的值或者内容

    首先,SAX解析器以流式方式读取XML文档,当遇到文档的不同部分时,会触发相应的事件,如开始文档、开始元素、结束元素等。开发者可以注册事件处理器来响应这些事件,从而获取XML元素的信息。 1. **初始化解析器**:...

    android SAX解析String类型 XML 字符串

    SAX(Simple API for XML)是一种事件驱动的解析器,它在读取XML文档时触发一系列事件,如开始元素、结束元素、字符数据等。开发者通过实现SAX解析器的回调接口,来处理这些事件,从而解析XML。这种方式非常适用于...

    SAX解析XML实例

    在压缩包文件"TestSAX"中,可能包含了一个简单的SAX解析示例程序,用于演示如何解析XML文档并输出相关元素信息。你可以根据上述步骤查看和运行代码,理解SAX解析的实际工作流程。 总的来说,SAX解析XML是一种高效且...

    SAX解析超大XML文件 示例代码

    在处理大型XML文件时,传统的DOM(Document Object Model)解析方式可能会遇到性能问题,因为DOM会将整个XML文档加载到内存中,对于超大文件,这可能导致内存溢出。为了解决这个问题,我们可以采用流式解析的方式,...

    一个关于sax解析xml的demo

    SAX(Simple API for XML)是XML解析的一种方式,它以事件驱动模型来处理XML文档,相比于DOM(Document Object Model)解析,SAX解析器占用更少的内存,更适合处理大型XML文件。 SAX解析的基本原理是读取XML文档,...

    JAVA SAX解析XML

    SAX解析器是一种基于事件驱动的解析器,它不会一次性加载整个XML文档到内存中,而是逐行读取,当遇到XML文档中的元素、属性等特定事件时,会触发相应的回调方法。这种方式非常适合处理大型XML文件,因为它可以有效地...

    java Sax解析Xml

    在提供的"xmlparse_1"文件中,可能包含了一个RSS feed的示例,通过SAX解析,我们可以提取出标题、描述和其他相关信息,而无需一次性加载整个XML文档到内存中,这对于处理大型RSS源特别有用。通过SAX解析,我们可以在...

    XML通过sax解析JSON格式

    标题中提到的"XML通过SAX解析为JSON格式"是指使用SAX解析器来读取XML文档,并将其转换成等效的JSON对象。SAX解析器以流式方式处理XML,当遇到文档的不同部分(如开始标签、结束标签、文本节点等)时,会触发相应的...

    sax的jar包,xml

    在Java中,SAX解析器被广泛使用,因为它是一种基于事件驱动的解析模型,能够有效地处理大型XML文档,因为它不需要一次性加载整个文档到内存中。这种特性使得SAX解析在处理大量数据时比DOM(Document Object Model)...

    SAX解析xml文件源码

    SAX解析器在读取XML文档时会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素、字符数据等。开发者需要创建一个实现了SAX解析器回调接口的类,当解析器遇到这些事件时,会调用相应的方法,将XML内容传递...

    jsp操作xml源码,解析器为DOM和SAX

    2. SAX解析器:SAX是一种事件驱动的解析方式,它不会将整个XML文档加载到内存,而是逐行读取并触发相应的事件处理器,如开始元素、结束元素等。这种方式节省了内存,适合处理大型XML文件,但操作起来相对复杂,不...

    sax解析xml实例

    2. **解析器配置**:首先,我们需要创建一个SAX解析器,通常使用XMLReaderFactory类的newXMLReader()方法,并通过setFeature()方法配置解析器的行为,例如是否忽略空白字符、是否验证XML文档等。 3. **事件处理器**...

    [Android]使用SAX解析XML文件

    SAX解析器在读取XML文件时,会触发一系列的事件,例如开始文档、结束文档、开始元素、结束元素等。开发者需要创建一个实现了SAX解析器接口的类,即`DefaultHandler`或自定义的处理器,然后重写这些事件的方法,以便...

    Android XML解析——Sax解析XML

    SAX解析器以流式方式读取XML文档,遇到元素、属性等结构时会触发相应的事件回调。开发者需要定义一个ContentHandler类来处理这些事件,如开始元素、结束元素、字符数据等。这种方式避免了整个XML文档加载到内存中,...

Global site tag (gtag.js) - Google Analytics