我目前正在尝试编写一个应用程序(游戏),我希望它可以在桌面和 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 解析问题,但这似乎并不那么简单......