如何在Java中读取格式良好的XML,但是跳过模式?
我想读取一个在其中有一个模式声明的
XML文件.
这就是我想做的,读它.我不在乎它是否有效,但我希望它形成良好. 问题是读者试图读取模式文件,并且失败. 我不想让它甚至尝试. 我已经尝试禁用验证,但它仍然坚持尝试读取模式文件. 理想情况下,我想用一个Java 5 JDK库存来实现. 这是我到目前为止,很简单: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(false); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(file); 这是我回来的例外: java.lang.RuntimeException: java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 是的,这个HAPPENS是一个XHTML模式,但这不是一个“XHTML”问题,这是一个XML问题.只是指出,所以人们不会分心.而在这种情况下,W3C基本上就是说“不要求这件事,这是一个愚蠢的想法”,我同意.但是,这又是一个问题的细节,而不是它的根源.我不想要求所有. 解决方法
引用不是针对模式,而是用于DTD.
DTD文件不仅可以包含结构规则.它们还可以包含实体引用. XML解析器有义务加载和解析DTD引用,因为它们可能包含可能影响文档解析的实体引用和文件的内容(您可以为文本或甚至整个短语的实体引用). 如果您想避免加载和解析引用的DTD,you can provide your own EntityResolver并测试引用的DTD,并决定是否加载DTD文件的本地副本或仅返回null. 来自自定义EntityResolvers的参考答案的代码示例: builder.setEntityResolver(new EntityResolver() { @Override public InputSource resolveEntity(String publicId,String systemId) throws SAXException,IOException { if (systemId.contains("foo.dtd")) { return new InputSource(new StringReader("")); } else { return null; } } }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 使用@XMLJavaTypeAdapters进行JAXB解组
- Scala与Java 9不兼容 – java.lang.NoClassDefFoundError
- java – 没有commandName的弹簧窗体[复制]
- 尝试通过Java 8中的JDBC-ODBC连接到.accdb文件时出现ClassN
- 在Java 8中是否存在并发中发生的活动失败
- Java对象到底能占多大内存?
- java – 直观地浏览JACKRABBIT内容?
- java – ArrayList的特殊行为remove() – 为什么?
- java – 使用WildFly 8的简单REST API
- ArrayList、Vector、LinkedList的区别