【问题标题】:DTD parsing with axiom使用公理进行 DTD 解析
【发布时间】:2021-09-13 18:21:12
【问题描述】:

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

无法创建 OMDocType,因为 XMLStreamReader 不支持 DTDReader 扩展

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

示例 sn-p:

    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 设置为任何值都会导致以下堆栈跟踪:

线程“主”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)

【问题讨论】:

  • 一个快速说明:如果我没看错的话,问题参考是 wrt SJSXP,JDK 捆绑的 Stax 实现,而不是 Woodstox。所以它的修复不会改变 Woodstox 的使用。您可能仍想验证类路径中没有其他 Stax 实现。不幸的是,异常没有显示实现/提供者类来排除这种可能性。
  • 是的,但我手动验证了有问题的 XMLStreamReader 是一个 com.ctc.wstx.sr.ValidatingStreamReader(IntelliJ 告诉我它来自 woodstox-core 6.2.6 jar,正如预期的那样)。这就是我如此困惑的原因:正如我提到的链接中所提到的,即使使用 JDK 捆绑的 Stax 实现,我什至不应该遇到这个错误,因为我使用的是 axiom 1.2.22,甚至建议的解决方法是在最新版本无法使用。

标签: java xml stax axiom woodstox


【解决方案1】:

我不确定为什么在使用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 版本也解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2016-04-23
    • 2011-07-26
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2014-03-01
    相关资源
    最近更新 更多