一、不含自定义字符或含较少量的特殊字符
一般的特殊字符有五个:&,<,>,’(单引号),”(双引号)。这些字符如果直接出现在xml文档中,一般是不能解析出来的,如解析<example>a&b<example>时会报错。解决方法有两个:1.用<![CDATA[ ]]>标记;2.转义。
1. 用<![CDATA[ ]]>标记
对于含特殊字符的element用<![CDATA[ ]]>标记起来即可成功解析,如<example><![CDATA[a&b]]><example>
该方法简单但不实用,对于每个含特殊字符的element都要用<![CDATA[ ]]>标记。数量很少是推荐用这种方法。
2. 转义
特殊字符数量很多时方法1显然不实用,此时可用转义来实现:
< < 小于号
> > 大于号
& & 和
' ' 单引号
" " 双引号
即将xml中的特殊文档全部替换为转义字符,如<example>a&b<example>变成<example>a&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原理(百度)
如何解析含DTD的xml文件呢?
将dtd文件导入当前工程,在xml文件中加入
<!DOCTYPE xml文件名 SYSTEM "src/dblp.dtd">即可。
如解析<example>aüb<example>,在dtd文件中声明
<!ENTITY uuml "ü"><!-- small u, dieresis or umlaut mark --> 验证ü代表字符ü。
三、含单引号的xml解析后插入数据库:
用上面方法可以解析出xml中含单引号的数据(String型数据),但要将数据插入数据库中却很容易出现问题,因为sql语句中不允许单独的单引号存在,解决办法很简单,将解析所得的数据中的单引号用函数replaceAll()替换成双引号在插入数据库即可。
四、解析含较多实体引用的大型的xml文档(如1G)
xml实体引用都是以&开头,以;结尾,如第二大点中的ü就是一个实体引用。对于大型的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内容。这种方式使得...
2. **SAX解析**:SAX是一种事件驱动的解析方式,它逐行读取XML文档,遇到元素、属性等时触发相应的事件处理器。这种方式节省内存,适合处理大型XML文件。"sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析...
SAX解析的基本工作原理是通过事件处理器(如ContentHandler、EntityResolver等)来接收XML文档的解析事件,如开始文档、结束文档、开始元素、结束元素、字符数据等。当解析器遇到这些事件时,会调用相应的处理器方法...
本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 首先,我们需要了解SAX解析的基本原理。SAX解析器不创建整个XML文档树,而是当遇到XML文档的各个部分(如元素、属性、文本等)时,触发相应的事件回调函数。...
SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...
XML解析器在读取XML文档时会自动处理特殊字符。如果解析器发现未转义的特殊字符,它会抛出错误,因为这可能表示XML文档格式不正确。确保正确编码特殊字符是防止解析错误的关键。 **4. CDATA区** 除了实体引用,XML...
首先,SAX解析器以流式方式读取XML文档,当遇到文档的不同部分时,会触发相应的事件,如开始文档、开始元素、结束元素等。开发者可以注册事件处理器来响应这些事件,从而获取XML元素的信息。 1. **初始化解析器**:...
SAX(Simple API for XML)是一种事件驱动的解析器,它在读取XML文档时触发一系列事件,如开始元素、结束元素、字符数据等。开发者通过实现SAX解析器的回调接口,来处理这些事件,从而解析XML。这种方式非常适用于...
在压缩包文件"TestSAX"中,可能包含了一个简单的SAX解析示例程序,用于演示如何解析XML文档并输出相关元素信息。你可以根据上述步骤查看和运行代码,理解SAX解析的实际工作流程。 总的来说,SAX解析XML是一种高效且...
在处理大型XML文件时,传统的DOM(Document Object Model)解析方式可能会遇到性能问题,因为DOM会将整个XML文档加载到内存中,对于超大文件,这可能导致内存溢出。为了解决这个问题,我们可以采用流式解析的方式,...
SAX(Simple API for XML)是XML解析的一种方式,它以事件驱动模型来处理XML文档,相比于DOM(Document Object Model)解析,SAX解析器占用更少的内存,更适合处理大型XML文件。 SAX解析的基本原理是读取XML文档,...
SAX解析器是一种基于事件驱动的解析器,它不会一次性加载整个XML文档到内存中,而是逐行读取,当遇到XML文档中的元素、属性等特定事件时,会触发相应的回调方法。这种方式非常适合处理大型XML文件,因为它可以有效地...
在提供的"xmlparse_1"文件中,可能包含了一个RSS feed的示例,通过SAX解析,我们可以提取出标题、描述和其他相关信息,而无需一次性加载整个XML文档到内存中,这对于处理大型RSS源特别有用。通过SAX解析,我们可以在...
标题中提到的"XML通过SAX解析为JSON格式"是指使用SAX解析器来读取XML文档,并将其转换成等效的JSON对象。SAX解析器以流式方式处理XML,当遇到文档的不同部分(如开始标签、结束标签、文本节点等)时,会触发相应的...
在Java中,SAX解析器被广泛使用,因为它是一种基于事件驱动的解析模型,能够有效地处理大型XML文档,因为它不需要一次性加载整个文档到内存中。这种特性使得SAX解析在处理大量数据时比DOM(Document Object Model)...
SAX解析器在读取XML文档时会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素、字符数据等。开发者需要创建一个实现了SAX解析器回调接口的类,当解析器遇到这些事件时,会调用相应的方法,将XML内容传递...
2. SAX解析器:SAX是一种事件驱动的解析方式,它不会将整个XML文档加载到内存,而是逐行读取并触发相应的事件处理器,如开始元素、结束元素等。这种方式节省了内存,适合处理大型XML文件,但操作起来相对复杂,不...
2. **解析器配置**:首先,我们需要创建一个SAX解析器,通常使用XMLReaderFactory类的newXMLReader()方法,并通过setFeature()方法配置解析器的行为,例如是否忽略空白字符、是否验证XML文档等。 3. **事件处理器**...
SAX解析器在读取XML文件时,会触发一系列的事件,例如开始文档、结束文档、开始元素、结束元素等。开发者需要创建一个实现了SAX解析器接口的类,即`DefaultHandler`或自定义的处理器,然后重写这些事件的方法,以便...
SAX解析器以流式方式读取XML文档,遇到元素、属性等结构时会触发相应的事件回调。开发者需要定义一个ContentHandler类来处理这些事件,如开始元素、结束元素、字符数据等。这种方式避免了整个XML文档加载到内存中,...