`

转载: 使用dom4j解析XML时候忽略DTD文件

阅读更多
官方包下载地址:http://www.dom4j.org/download.html
转载: http://www.blogjava.net/rain1102/archive/2009/09/07/290063.html
当你用domj读取一个有dtd验证的xml文件,同时你的网络是不通的情况下。会出现以下错误:
Caused by:
org.dom4j.DocumentException: www.bea.com Nested exception: www....com
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.dom4j.io.SAXReader.read(SAXReader.java:264)


参照: javaeye上另一文章方法:声明本地的dtd验证
hibernate.sourceforge.net Nested exception: hibern
http://cherryqq.iteye.com/blog/401862
处理方法:
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "file:///F:/hibernate-test/classes/hibernate-mapping-2.0.dtd">

就可以了。
但这样很麻烦.


其实我们的XML肯定是合法的,不需要验证。
而设置不需要验证,只需要设置DocumentBuilderFactory.setValidating(false)
就可以达到效果了,但是解析器还是会读取DTD的,解决的方法是实现EntityResolver接口,具体代码如下:

import Java.io.ByteArrayInputStream;
import Java.io.IOException;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class IgnoreDTDEntityResolver implements EntityResolver {

 @Override
 public InputSource resolveEntity(String publicId, String systemId)
   throws SAXException, IOException {
        return new InputSource(
             new ByteArrayInputStream(
                   "<?xml version='1.0' encoding='UTF-8'?>".getBytes()
    ));
 }

}

然后设置SAXReader 对象如下:
SAXReader reader = new SAXReader();
reader.setEntityResolver(new IgnoreDTDEntityResolver()); 

就行了

另外一种方式为:
SAXReader xppReader = new SAXReader();
xppReader.setValidation(false);// 不验证xml文件内的dtd
xppReader.setEntityResolver(new EntityResolver() {
public InputSource resolveEntity(String publicId,
String systemId) throws SAXException, IOException {
InputStream stream = XmlUtil.class.getClassLoader().getResourceAsStream("***.dtd");
InputSource is = new InputSource(stream);
is.setPublicId(publicId);
is.setSystemId(systemId);
return is;
}
});
分享到:
评论

相关推荐

    解析XML文件(字符串)的两种方法

    #### dom4j解析XML时忽略DTD文件验证 在使用`SAXReader`或`DocumentHelper`解析XML时,默认情况下会验证DTD(Document Type Definition),这可能会导致解析速度变慢或者因为DTD文件不存在而抛出异常。为了提高效率...

    Dom4j使用简介.pdf

    Dom4j 是一个易于使用且功能强大的 Java 库,主要用于处理 XML 文件。它不仅支持 XML 的解析,还支持 XPath 和 XSLT,使其成为 Java 开发者在进行 XML 处理时的首选工具之一。Dom4j 的官方网站将其定义为“一个易于...

    Xml解析.docx

    此外,DOM解析器支持DTD(Document Type Definition)和XML Schema进行验证,可以通过调用`setValidating()`和`setIgnoringElementContentWhitespace()`方法来开启或关闭验证和忽略元素内容中的空白。 2. SAX解析:...

    使用Java解析XML

    Java提供了多种方式来解析XML文档,包括DOM解析和SAX解析,这两种方式各有优缺点,适用于不同的场景。本章将详细介绍这两种解析方法,并通过实例讲解如何使用Java来获取XML文档中的标签内容和属性。 1. **解析器的...

    sax解析xml文件

    SAX解析XML文件的核心思想是读取XML文件时,遇到每个元素、属性或其他结构时,都会触发一个相应的事件处理器方法。这些处理器方法由应用程序实现,从而对XML文档进行处理。下面将详细介绍SAX解析XML的基本步骤、主要...

    xml解析Demo以及相关jar包

    - 解析XML:调用解析器的parse()方法开始解析,对于DOM解析,会返回一个Document对象;对于SAX或StAX,会触发一系列事件回调。 - 处理解析结果:对解析得到的数据进行操作,如查找特定元素、提取属性值、转换为...

    Sax解析xml_动力节点Java学院整理

    SAX,全称为Simple API for XML,是一种基于事件驱动的XML解析器,相较于DOM解析,它具有更快的速度和更低的内存占用。DOM解析会将整个XML文档加载到内存中形成一个节点树,适合处理小规模或内存有限的情况。而SAX则...

    tinyxml+tinyxpath组合编程套件,很好的编程工具,都是源码

    另一种是忽略DTD文件,只要基本格式正确,就可以进行解析。 就我所知,验证的解析器通常都是比较重量级的。TinyXml不支持验证,但是体积很小,用在解析格式较为简单的XML文件,比如配置文件时,特别的合适。

    xml知识总结

    1. **DOM解析**:将整个XML文档加载到内存,形成一个树形结构,便于遍历和操作。 2. **SAX解析**:事件驱动,逐行读取XML文档,对每个元素、属性等触发相应事件,节省内存。 3. **StAX解析**(流式API):允许程序按...

    Xerces-J-tools.1.2.1.zip

    4. 解析XML文档:调用XMLReader的parse方法,传入XML文档的输入源。 此外,Xerces-J还提供了其他功能,例如DOM解析器,适用于需要在内存中构建整个XML文档结构的情况;JAXP接口则允许灵活地选择解析器实现,无论是...

    XML基础及DOM 文档对象模式和SAX 基于事件处理模式 学习笔记

    ### XML基础及DOM 文档对象模式和SAX 基于事件处理模式 学习笔记 #### XML概述 XML(可扩展标记语言)是一种由W3C(万维网联盟)定义的标记语言,用于存储和传输数据。与HTML相比,XML更注重于数据的描述而非展示...

    XML1.0标准(第二版).pdf

    ### XML 1.0 标准(第二版...常见的处理器包括DOM解析器和SAX解析器。 #### 6. 记法 XML记法用于定义特定类型的数据,如图像或声音文件的格式。记法声明可以出现在文档类型定义中,用于指定文档中特定元素的数据类型。

    php解析xml 的四种简单方法(附实例)

    例如,它是一个无验证的解析器,忽略与文档相关联的DTD(文档类型定义)。如果XML文档格式不正确,解析过程可能以错误消息终止。此外,Expat解析器只支持US-ASCII、ISO-8859-1和UTF-8编码格式的XML数据。如果XML数据...

    xml读取,不需要任何jar包

    需要注意的是,虽然Java标准库提供了这些功能,但在某些情况下,如处理大型XML文件或需要更高级的功能(如XPath查询),可能需要引入如Apache DOM4J或JDOM等第三方库,它们提供了更高效、更易用的API。 在提供的`...

    php 解析xml 的四种方法详细介绍

    - 缺点:不支持验证,忽略DTD(文档类型定义),仅支持US-ASCII, ISO-8859-1和UTF-8三种编码。另外,对于需要基于XML结构进行复杂操作的情况,使用起来可能较困难。 - 主要函数:`xml_parse_into_struct`用于将XML...

    非常好非常简练的XML教程-推荐

    6. CDATA段:在XML中,某些数据可能包含需要被解析器忽略的特殊字符,这时可以使用CDATA段,如`&lt;![CDATA[ 这里是不受解析器解析的文本 ]]&gt;`。 7. 解析和处理XML:XML解析器读取XML文档并将其转换为数据结构,如DOM...

    SAX2 API (英文html)

    4. 使用XMLReader的`parse`方法开始解析XML输入源(如文件或流)。 SAX2还支持命名空间处理,这是通过`NamespaceSupport`类实现的,它可以帮助跟踪XML文档中的命名空间声明,以便在处理元素时正确地处理命名空间...

    C# XML 类库

    `XmlReader`是高效的只进XML解析器,用于顺序读取XML文档而不创建整个文档对象模型(DOM)。它适用于大文件和性能敏感的场景。`XmlWriter`则用于写入XML,提供了一种流式的方法来构建XML文档。 6. **XPath和...

    XML开发技术--试卷B.pdf

    8. SAX (Simple API for XML):SAX是一种事件驱动的API,用于解析XML文档。它逐个读取XML文档中的数据,并在读取过程中触发事件,应用程序可以在事件处理中执行必要的操作。SAX适合处理大型文档,因为它不需要将整个...

Global site tag (gtag.js) - Google Analytics