2015-11-12 108 views
0

關於java中的XML模式版本和解析庫,我明白最好的方法是使用「1.0」而不是「1.1」,因爲不是所有的庫和環境支持它,好處是幾乎沒有,但面臨的情況是XML模式「1.1」,「必須」得到支持,我有以下問題:XMLStreamException:不支持XML版本「1.1」,只有XML 1.0支持

在這部分程序:

XMLInputFactory factory = XMLInputFactory.newInstance(); 
    XMLEventReader reader = factory.createXMLEventReader(XsltTest.class.getResourceAsStream("/an-xsl-file.xsl")); 

    String encoding = null; 
    if(reader.hasNext()){ 
     XMLEvent event = reader.nextEvent(); 
     if(event instanceof StartDocument){ 
      encoding = ((StartDocument)event).getCharacterEncodingScheme(); 
     } 
    } 

其中「an-xsl-file.xsl」是一個使用XML Schema版本「1.1」的XSLT文件,在調用reader.nextEvent()時會拋出一個XMLStreamException,爭辯只有XML 1.0被支持,如果我在一個獨立的java項目(jdk 1.7)中使用相同部分的代碼,那麼這個代碼片段沒有問題,但是當這個代碼片段在具有相同JVM的特定應用程序中運行時,它會失敗我提到的方式;這表明我認爲可能存在依賴性問題,但我還沒有弄清楚它可能是什麼。

應用程序使用XML和XSLT處理庫,如:

  • 撒克遜9
  • 的Xerces
  • 蓖麻XML
  • 的Xalan

其中,我剛開始熟悉它們,所以我不確定它們內部是否會有衝突,是否有任何已知的衝突問題?或者它只是另一種不同的東西?我錯過了什麼?你能分享一下你對它的瞭解嗎?

順便說一句,現在,我只是不能使用XML版本1.0,主要是因爲該文檔僅使用1.1中支持的字符代碼。

謝謝!

編輯:

好感謝您的意見,我知道這可能是一個非常廣泛的問題,但說實話,這是我面臨的權利現在的情況,這就是爲什麼我在找一個提示可能是什麼問題,從而進一步調查和改進信息。

這是異常跟蹤的一部分:

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,20] 
Message: XML version "1.1" is not supported, only XML 1.0 is supported. 
     at com.sun.xml.stream.XMLReaderImpl.next(XMLReaderImpl.java:508) 
     at com.sun.xml.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:62) 
     at com.pkg.tofailing.artifact.ClassWithError.getXMLEncoding(ClassWithError.java:216) 

其中「getXMLEncoding」是包含的代碼所提供的片段,抱歉,但我可能會惹上麻煩的方法,如果我分享不止於此,其餘stacktrace只包含應用程序類。

此外,關於XSL文件我提到,這是怎麼開始:

<?xml version="1.1" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/> 

的故障發生時,光看第一行,在那裏遇到了1.1版本的XML的,如果我改變它爲1.0,然後另一個誤差與該內容的後線提出:

<xsl:text>&#12;&#10;</xsl:text> 

字符「&#12;」根據www.w3.org未被使用的是使其在XML 1上失敗的一個。0,但由於某些原因,它必須支持並且XML 1.1才能支持,現在問題出現在XML版本中。

希望現在情況更清楚。

再次感謝!

+2

撒克遜支持[1.1 XSD,而現在(http://www.saxonica.com/documentation9.5/#!conformance/schema11)。它也支持XML 1.1。您的文本不是很清楚您的錯誤是否與使用的XML版本(1.1是_very,非常罕見)或XSD版本(更常見的是1.1)有關,這將有助於顯示您獲得的_exact_錯誤,並且最好與提升它的工具列表中的確切工具。 – Abel

+0

添加到@ Abel的觀點:XML和XSD版本中的1.1完全不同。你應該說明你爲什麼需要其中一個或兩個的具體原因,並詢問關於特定圖書館特定版本的具體問題。您的帖子在大量標準和工具中漫遊,而沒有真正要求回答的問題。 – kjhughes

+1

@ kjhughes,但這可能是因爲OP說「我剛剛開始熟悉它們」,如果你第一次開始就很難區分所有這些工具和技術層次(這並不是說我們不需要獲得更好的細節)。 – Abel

回答

1

com.sun.xml.stream參考建議你有Sun的SJSXP StAX的實現上(可能是舊的)版本你的類路徑。如果在類路徑中有StAX實現(sjsxp,woodstox等),那麼當您執行XMLInputFactory.newInstance()時,將優先使用JRE中的內置實現。

爲了確定它可以工作,無論添加到類路徑中是否還有其他東西,您應該依賴已知良好的StAX實現(如Woodstox),並直接創建一個實例,而不是依賴反射方法的newInstance()

XMLInputFactory factory = new WstxInputFactory(); 
+0

謝謝伊恩,你的方法很好,它應該是這樣的,不幸的是在我的情況下,已經有一個已經實現的應用程序,其中包含大量的組件和庫引用,實際上,我只是證明了這種情況是依賴關係解析但不是最終的解決方案,因爲我可能會破壞別的東西,現在我需要確保我可以更改或刪除該庫或在類路徑中使用該jar,強制使用JRE實現,我現在不會可能的或者介紹你的建議Woodstox。 – Ohtar10

+0

我想給你正確的答案,因爲儘管仍然有一些問題,這種方法顯示了一個清晰的工作場景,並與主要問題聯繫在一起。謝謝老師。 – Ohtar10

0

好了,我設法解決我的情況,現在是時候和大家分享我發現:

因爲我想象這可能是在運行時依賴的問題,我做了一些在如何發現哪裏查找實現類被加載,最後我在主程序的執行過程中添加了-verbose:class VM arg,以查看com.sun.xml.stream.XMLReaderImpl的加載位置,發現它是從加載sjsxp.jar正在加載應用程序運行時,我剛從類路徑中刪除此jar,現在該功能正常工作。

結論是,這是一個運行時依賴解析的問題,由於使用了這個jar而不是JRE的實現,而且sjsxp.jar也指出JSR-173不支持XML 1.1。

關於-verbose:類VM ARG:https://dzone.com/articles/how-use-verbose-options-java 關於他sjsxp.jar(JSR-173):https://sjsxp.java.net/