使用公理进行 DTD 解析

问题描述

我正在尝试使用 axiom 1.2.22 和 woodstox 6.2.6 来解析带有 doctype 的 XML 文档。 (我使用的是 OpenJDK 11,但这应该没有任何区别。)我遇到了与 How to ignore DTD parsing in Apache's AXIOM 中提到的相同的错误

Cannot create OMDocType because the XMLStreamReader doesn't support the DTDReader extension

根据 https://issues.apache.org/jira/browse/AXIOM-475 的说法,应该在 axiom 1.2.16 中修复,但似乎该错误又回来了。

示例片段:

    InputStream is = Test.class.getResourceAsstream("xml-with-dtd.xml");
    OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXOMBuilder(XMLInputFactory.newFactory().createXMLStreamReader(is));
    OMElement result = builder.getDocumentElement();

我使用的是不兼容的版本吗?我也尝试使用 woodstox 5.0.0,它会引发相同的错误。在使用 XMLInputFactory.newFactory() 时,我还验证了它实际上是 woodstox XMLInputFactory。这些是我使用的 Maven 依赖项(我省略了一些与日志记录和重复类相关的排除项):

  <dependency>
    <groupId>com.fasterxml.woodstox</groupId>
    <artifactId>woodstox-core</artifactId>
    <version>6.2.6</version>
  </dependency>
  <dependency>
    <groupId>org.codehaus.woodstox</groupId>
    <artifactId>stax2-api</artifactId>
    <version>4.2.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.ws.commons.axiom</groupId>
    <artifactId>axiom-impl</artifactId>
    <version>1.2.22</version>
  </dependency>
  <dependency>
    <groupId>org.apache.ws.commons.axiom</groupId>
    <artifactId>axiom-api</artifactId>
    <version>1.2.22</version>
  </dependency>

更新:看起来很像公理代码试图从配置属性中确定要使用的 DTDReader 类。不幸的是,将 XMLInputFactory 中的属性 DTDReader.PROPERTY 设置为任何值会导致以下堆栈跟踪:

Exception in thread "main" java.lang.IllegalArgumentException: Unrecognized property 'org.apache.axiom.ext.stax.DTDReader'
    at com.ctc.wstx.api.CommonConfig.reportUnkNownProperty(CommonConfig.java:167)
    at com.ctc.wstx.api.CommonConfig.setProperty(CommonConfig.java:158)
    at com.ctc.wstx.api.ReaderConfig.setProperty(ReaderConfig.java:35)
    at com.ctc.wstx.stax.WstxInputFactory.setProperty(WstxInputFactory.java:400)

解决方法

我不知道为什么当我用 woodstox 5 尝试它时它不起作用,但是这个针对 axiom 1.2.22 的小补丁至少解决了 woodstox 6.2.6 的问题:

Index: axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/StAXDialectDetector.java
===================================================================
--- axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/StAXDialectDetector.java (revision 1891409)
+++ axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/StAXDialectDetector.java (working copy)
@@ -274,6 +274,7 @@
                     return new Woodstox4Dialect(version.getComponent(1) == 0 && version.getComponent(2) < 11
                             || version.getComponent(1) == 1 && version.getComponent(2) < 3);
                 case 5:
+                case 6:
                     return new Woodstox4Dialect(false);
                 default:
                     return null;

更新:

1.3.0 版 axiom 也解决了这个问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...