使用公理解析 DTD
DTD parsing with axiom
我正在尝试将 axiom 1.2.22 与 woodstox 6.2.6 结合使用来解析具有文档类型的 XML 文档。 (我使用的是 OpenJDK 11,但这应该没有任何区别。)我遇到了 中提到的相同错误:
无法创建 OMDocType,因为 XMLStreamReader 不支持 DTDReader 扩展
根据 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 依赖项(我省略了一些与日志记录相关的排除项并重复了 classes):
<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 class。不幸的是,将 XMLInputFactory 中的 属性 DTDReader.PROPERTY 设置为任何值都会导致以下堆栈跟踪:
线程 "main" java.lang.IllegalArgumentException 中的异常:无法识别 属性 'org.apache.axiom.ext.stax.DTDReader'
在 com.ctc.wstx.api.CommonConfig.reportUnknownProperty(CommonConfig.java:167)
在 com.ctc.wstx.api.CommonConfig.setProperty(CommonConfig.java:158)
在 com.ctc.wstx.api.ReaderConfig.setProperty(ReaderConfig.java:35)
在 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;
更新:
axiom 1.3.0 版本也修复了这个问题。
我正在尝试将 axiom 1.2.22 与 woodstox 6.2.6 结合使用来解析具有文档类型的 XML 文档。 (我使用的是 OpenJDK 11,但这应该没有任何区别。)我遇到了
无法创建 OMDocType,因为 XMLStreamReader 不支持 DTDReader 扩展
根据 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 依赖项(我省略了一些与日志记录相关的排除项并重复了 classes):
<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 class。不幸的是,将 XMLInputFactory 中的 属性 DTDReader.PROPERTY 设置为任何值都会导致以下堆栈跟踪:
线程 "main" java.lang.IllegalArgumentException 中的异常:无法识别 属性 'org.apache.axiom.ext.stax.DTDReader' 在 com.ctc.wstx.api.CommonConfig.reportUnknownProperty(CommonConfig.java:167) 在 com.ctc.wstx.api.CommonConfig.setProperty(CommonConfig.java:158) 在 com.ctc.wstx.api.ReaderConfig.setProperty(ReaderConfig.java:35) 在 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;
更新:
axiom 1.3.0 版本也修复了这个问题。