2

我目前正在尝试编写一个应用程序(游戏),我希望它可以在桌面和 Android 上运行。我选择使用的数据格式是 XML,因为它比 JSON 更灵活、更强大,它比数据库执行得更好,而且我熟悉并喜欢它。

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

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

我已经设法让一切都在桌面上运行,但是,一旦我尝试在 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 解析问题,但这似乎并不那么简单......

4

2 回答 2

0

查看DocumentBuilderFactory.newInstance()的 javadocs

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

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

我猜是你想要的课程

例如:

System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
doFunkyXmlStuff();
于 2018-08-22T22:41:00.450 回答
0

要指定要用作 Xerces-2 的解析器,我建议在实例化 DocumentBuilderFactory 时传递解析器类名,如下所示:

DocumentBuilderFactory docFactory = DocumentBuilderFactory
        .newInstance("org.apache.xerces.jaxp.DocumentBuilderFactoryImpl", null);
docFactory.setXIncludeAware(true);
于 2021-11-12T20:55:23.587 回答