簡體   English   中英

如何指定要使用的 XML 解析器實現?

[英]How can I specify which XML parser implementation to use?

我目前正在嘗試編寫一個應用程序(一個游戲),我希望它可以在桌面和 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 解析問題,但它似乎並不那么簡單......

查看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();

要指定用作 Xerces-2 的解析器,我建議在實例化 DocumentBuilderFactory 時傳遞解析器類名,如下所示:

DocumentBuilderFactory docFactory = DocumentBuilderFactory
        .newInstance("org.apache.xerces.jaxp.DocumentBuilderFactoryImpl", null);
docFactory.setXIncludeAware(true);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM