`
yiyu
  • 浏览: 187221 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读取xml文件时不做validation的方法

    博客分类:
  • java
阅读更多
今天遇到一个问题,我使用dom4j读取一个xml文件的内容,该xml文件中指定了一个dtd文件,而我并没有这个dtd文
件,在我用SAXReader读取xml文件时,便报如下错误:

java.io.FileNotFoundException: [dtd文件名] (The system cannot find the file specified)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:106)
	at java.io.FileInputStream.<init>(FileInputStream.java:66)
	at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
	at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:653)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1315)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:1282)
	at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:283)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1192)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1089)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1002)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
	at org.dom4j.io.SAXReader.read(SAXReader.java:465)
	at org.dom4j.io.SAXReader.read(SAXReader.java:321)


看来,是xerces自动进行了语法检查,其实这个xml文件是合法的,我这是想读取其中一些数据,并不想做validation,而
且我也不能删除xml中的对dtd的引用,我想,只要关闭默认的语法检查就可以了。查了查dom4j的文档,我把能想到的设置
都关闭了:

	reader.setValidation(false);
	reader.setIncludeInternalDTDDeclarations(false);
	reader.setIncludeExternalDTDDeclarations(false);
	reader.setFeature("http://apache.org/xml/features/validation", false);


可是,仍然不行,没办法,只好跟踪源码了,最后在xerces的XMLDocumentScannerImpl里发现了这段代码:

	if (((fValidation || fLoadExternalDTD) 
		&& (fValidationManager == null || !fValidationManager.isCachedDTD()))) {
		// This handles the case of a DOCTYPE that had neither an internal subset or an external subset.
		fDTDScanner.setInputSource(fExternalSubsetSource);
		fExternalSubsetSource = null;
		if (!fDisallowDoctype)
			setScannerState(SCANNER_STATE_DTD_EXTERNAL_DECLS);
		else
			setScannerState(SCANNER_STATE_PROLOG);
		setDriver(fContentDriver);
		if(fDTDDriver == null)
			fDTDDriver = new DTDDriver();
		return fDTDDriver.next();
	}


需要把fValidation和fLoadExternalDTD都设成false才行,继续研究代码,最后终于找到了解决办法:
	SAXReader reader = new SAXReader(false);
	reader.setValidation(false);
	reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
	Document document = reader.read(xmlFile);


其中setValidation(false);可以将fValidation设置成false,setFeature("http://apache.org/xml/features/
nonvalidating/load-external-dtd", false);将fLoadExternalDTD设置成false。

希望对其他遇到同样问题的人有些帮助。
分享到:
评论
6 楼 yiyu 2011-01-13  
再做一点补充

如果是使用JDK的DocuemntBuilder来读取xml时,可以这样:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse(file);
5 楼 tiger860709 2010-08-10  
多谢楼主分享,以前还真没碰到这种情况,不过以后碰到就知道如何处理了
4 楼 Carterslam 2010-08-09  
还有一种解决办法:
        //加上这一句,可以兼容dtd文件不存在的错误
        reader.setEntityResolver(new MyEntityResolver());


public class MyEntityResolver implements EntityResolver
{
    public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException
{
    return new InputSource(new ByteArrayInputStream(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>".getBytes()));
}
3 楼 godtiger 2010-06-22  
谢谢 这还是很有用的
2 楼 yiyu 2010-06-21  
哦,这样也是可以的呀,多谢赐教。
不过感觉比我的方法复杂了一点,呵呵。
1 楼 yxk67 2010-06-21  
SAXBuilder builder = new SAXBuilder();
            builder.setValidation(false);
            builder.setEntityResolver(new EntityResolver() {

public InputSource resolveEntity(String publicId,
                                                 String systemId) {
                    return new InputSource(new StringReader(""));
                }
            }
            );
            Document document = builder.build(new File(xmlName));

相关推荐

    java读取xml文件

    Java 读取 XML 文件是 Java 开发中常见的一项任务,XML(eXtensible Markup Language)作为一种可扩展标记语言,广泛用于数据交换、配置存储等领域。本教程将深入讲解如何在 Java 中处理 XML 文件,同时涉及 XML 的 ...

    用java读取修改xml文件的代码实现

    本文将详细介绍如何使用Java来读取和修改XML文件,主要涉及以下几个核心知识点: 1. **DOM解析器**: Document Object Model(DOM)是一种将XML文档转换为内存中的树形结构的方法,使得可以遍历和修改XML文件。...

    java读取XML文件

    在Java编程中,读取XML文件是一项常见的任务,特别是在处理配置、数据交换或者存储结构化信息时。XML(eXtensible Markup Language)是一种标记语言,它的设计目标是传输和存储数据,而不是显示数据。本篇文章将深入...

    具有读写XML功能的源码

    在读写XML时,源码可能会包含验证XML文档是否符合这些规范的代码,例如使用`javax.xml.validation.SchemaFactory`创建一个Schema对象,并用`javax.xml.transform.stream.StreamSource`来读取XML文件进行验证。...

    java操作xml文件的一个简单代码

    在提供的代码示例中,可能包括了使用上述一种或多种方法来读取XML文件,例如,可能会使用DOM的`DocumentBuilder`解析XML文件,然后使用`Node`接口的方法添加新的元素。具体的实现细节取决于代码内容,可能涉及到创建...

    Java 读写XML总结

    例如,`javax.xml.validation`包提供了XML Schema(XSD)验证的功能,可以确保XML文件符合预定义的模式。而XPath则允许我们方便地查找XML文档中的特定节点。 在Java中写入XML,可以选择使用上述的API将对象序列化为...

    XML 文件操作

    在读写XML文件时,可能会遇到各种错误,如文件不存在、格式错误等。因此,处理异常是必要的。使用`try-catch`块捕获`IOException`、`SAXException`等,以确保程序的健壮性。 总结,XML文件操作在Java编程中扮演着...

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

    在使用`SAXReader`或`DocumentHelper`解析XML时,默认情况下会验证DTD(Document Type Definition),这可能会导致解析速度变慢或者因为DTD文件不存在而抛出异常。为了提高效率和避免异常,可以通过设置解析器的相关...

    读取XML属性值.rar

    在读取XML属性值时,我们通常会用到以下知识点: 1. XML的基本结构:XML文档由元素、属性、文本、注释等组成。元素是XML文档的核心,它们通过开始标签和结束标签包围内容,如`&lt;element&gt;`...`&lt;/element&gt;`。属性是...

    Java 使用poi导入excel,结合xml文件进行数据验证的例子(已包含需要的Jar包)

    5. **读取XML文件并应用验证**:使用XSSFDataValidationHelper和XSSFDataValidationConstraint类读取XML文件并应用数据验证。 ```java import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi....

    java兼容linux版获取xml

    5. **字符编码**:XML文件通常使用UTF-8编码,Java在读取或写入文件时需指定正确的编码。使用`InputStreamReader`和`OutputStreamWriter`时,传递`"UTF-8"`作为参数,确保数据正确解码和编码。 6. **XML Schema/DTD...

    利用xerces对xml文件进行解析

    SAX(Simple API for XML)是一种事件驱动的解析方式,它不将整个XML文档加载到内存,而是逐行读取,遇到每个元素、属性等时触发相应的事件。这种方式适用于处理大型XML文件,以节省内存。在Xerces中,可以使用`org....

    xml的JAVA解析与格式定义

    另外,`java.util.Properties`类可以方便地读写XML格式的配置文件。 综上所述,XML在Java开发中扮演着重要角色,提供了多种解析和操作方式,开发者可以根据项目需求选择合适的工具和策略。DOM适合小规模且需频繁...

    java中实现xmlschema验证文件借鉴.pdf

    5. **Error Handling**: 在调用`validate()`方法时,可能会抛出`SAXException`和`IOException`。`SAXException`通常表示验证过程中出现错误,而`IOException`可能在读取XML或XSD文件时发生。这些异常应该被捕获并...

    xml帮助类,xml,C#

    6. **事件处理**:`XmlDocument`支持事件处理,如`Load`、`Validation`等,这在处理大型或动态XML时非常有用,可以实时监控文档加载和验证过程。 7. **DTD和XML Schema验证**:`XmlDocument`可以验证XML文档是否...

    java_xml.rar_java xml_sax_xml_xml ja_操作 xml

    这种方法节省了内存,但不支持随机访问,更适合处理大型XML文件。 - **SAX解析器优点**:内存效率高,适用于处理大型XML文件。 - **SAX解析器缺点**:不能直接访问和修改文档的任意位置,编程时需要处理事件回调...

    xml-apis.zip_JAVA XML_java xml_xml_zip

    DOM解析器适合小型或中型XML文档,但不适用于非常大的文件,因为可能导致内存消耗过大。 3. **JAXB(Java Architecture for XML Binding)**:虽然不在"xml-apis.jar"中,但通常与Java XML处理相关。JAXB允许将XML...

    vb关于XML操作实例

    3. **加载XML文档**:使用`Load`方法可以将XML文件加载到`XmlDocument`中: ```vb doc.Load("path_to_xml_file.xml") ``` 4. **解析XML文档**:可以使用XPath表达式查询XML节点。VB.NET中的`SelectNodes`和`...

    java实用工具包大众型XML处理

    Java实用工具包中的XML处理是Java开发者经常遇到的一项任务,特别是在处理数据交换、配置文件或者存储结构化数据时。XML(eXtensible Markup Language)因其结构清晰、可读性强的特点,被广泛应用。本工具包专门针对...

    Java Xml 编程指南书籍源码

    它允许开发者以流式的方式读写XML,可以控制解析或生成的进度,避免一次性加载整个文档。主要类包括`javax.xml.stream.XMLInputFactory`、`XMLStreamReader`和`XMLOutputFactory`。 4. JAXB(Java Architecture for...

Global site tag (gtag.js) - Google Analytics