如何指定要使用的XML解析器实现?

时间:2018-08-21 13:42:43

标签: android gradle xpath xerces xinclude

我目前正在尝试编写一个可以在台式机和Android上运行的应用程序(游戏)。我选择使用的数据格式是XML,因为它比JSON更加灵活和强大,它的性能比数据库更好,并且我对它很熟悉并且喜欢它。

但是,我开始怀疑是否真的可以使用XML。

除了普通的旧XML外,我还在数据结构中使用XInclude和XPath来定位相关节点。这似乎需要我在解析期间也验证我的XML,这很好,因为在开发XML时我已经编写了XML Schema。

我设法使所有内容都可以在桌面上运行,但是,一旦我尝试在Android上运行它,它就会失败。似乎Android上默认使用的XML解析器不支持XInclude(source)。

我在build.gradle中添加了以下行:

compile "xerces:xercesImpl:2.12.0"

似乎已经奏效了,如调试输出所示,SchemaFactory似乎可以解析为Xerces:

08-21 14:19:35.488 8254-8332 W/System.err: JAXP: Reading jar:file:/data/app/uk.co.redfruit.gdx.wobbegong-geDT8AfzN-vHBlDA-lE0_g==/base.apk!/META-INF/services/javax.xml.validation.SchemaFactory
    JAXP: instantiating org.apache.xerces.jaxp.validation.XMLSchemaFactory

但是DocumentBuilderFactory似乎正在使用默认的Android,因为它仍然会引发错误:

java.lang.UnsupportedOperationException: This parser does not support specification "Unknown" version "0.0"

当您在DocumentBuilderFactory上调用setXIncludeAware时,总是抛出什么(请参见上面的链接)。

我曾认为将其包含在gradle构建文件中可以解决问题,而且看起来部分地可以实现,但还不够。

我希望可以通过在所有平台上使用相同的解析器实现来解决所有跨平台XML解析问题,但这似乎并不那么简单...

1 个答案:

答案 0 :(得分:0)

看看DocumentBuilderFactory.newInstance()的javadocs

  

使用javax.xml.parsers.DocumentBuilderFactory系统属性。

我建议您将javax.xml.parsers.DocumentBuilderFactory系统属性设置为xerces DocumentBuilderFactory实现的类名

我猜想this是您想要的课程

例如:

System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderImpl");
doFunkyXmlStuff();