2014-02-05 37 views
1

我試圖根據XSD驗證XML文檔。我不允許透露XSD 的內容以對其進行修改,因爲它是用於對提交的XML報告進行服務器端驗證的官方XSD。如何繞過「此表達式在當前選項設置中不受支持」錯誤

我一直在使用SAX

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

    ClassPathResource resource = new ClassPathResource("path/to/xsd"); 
    Schema schema = schemaFactory.newSchema(resource.getFile()); //BOOM 

    Validator validator = schema.newValidator(); 
    validator.validate(new StreamSource(xmlFile)); 

由SAX報告錯誤,嘗試簡單的驗證碼是

org.xml.sax.SAXParseException: InvalidRegex: Pattern value '...' is not a valid regular expression. The reported error was: 'This expression is not supported in the current option setting.' at column '77'. 

有由this free tool跟蹤多個類似的錯誤。

我已閱讀這些錯誤與

在我的XSD 明確錨點[編輯]和非捕獲組(?!)。

由於錯誤說

「這種表達沒有在當前選項設置支持」我怎麼

在Java中的變化驗證選項,以繞過這個錯誤,並驗證具有明確的錨XSD和反向引用?

更新

好吧,讓我說,單獨從問題的主體。通過分析特定錯誤並查找字符串的第77列,我發現以下內容(從第74列開始):(?!((N|n)。有罪的角色是一個非捕獲組的驚歎號。我已經從XML上下文中分析了正則表達式本身,它根據數據的語義是有效的。因此,非捕獲組必須呆在那裏以排除特定的一組模式(在這種情況下,以大小寫不敏感開頭n

+0

如果錨的開頭或結尾,刪除它們。你不需要它。 XML驗證器始終根據整個字符串驗證表達式。 – nhahtdh

+0

我不允許修改架構。這是一個歐盟官方XSD。雖然刪除少量錨點可能是一個可行的解決方法(即使看看是否還有更多怪癖),但我們無法部署一個不針對官方模式進行驗證的解決方案,因爲我們的軟件生成的文檔**將被驗證由服務器。我在問是否有任何選項允許非XML風格的正則表達式 –

+0

您是否可以將其納入問題中? – nhahtdh

回答

1

看起來您的模式無效,因爲它使用XSD不允許的正則表達式規範。

有一些(所謂的)XSD處理器允許非標準的正則表達式;我相信這是微軟的模式處理器。

您只有兩種選擇:將模式修改爲符合條件,或使用實現模式中使用的專有擴展的模式處理器。

如果模式確實是一個「歐盟官方XSD」,則:

(一)我很驚訝你不準透露

(b)您有足夠的理由抱怨歐盟正在做一些不符合開放標準的事情。

+0

Upvote for(B)。對於(A),我可以告訴你關於http://www.eurodw.eu/的口號:「通過透明度恢復信心」,然後是XML評論:「這個XML模式是保密的,不應該透露或傳輸。 .....................「 –

+0

接受,因爲:我只是試圖使用Visual Studio 2013,它成功地驗證了我的輸出文檔針對該XSD。我也自願地引入了模式錯誤,VS報告「有罪」元素無效。至少我用Java生成器做了很好的工作 –

+0

我看了一下歐洲數據倉庫項目。它根本不像我這樣的「歐盟官方」的東西,它看起來像是一個私營部門項目,聲稱某種未明確的歐盟認可。 –

2

我一直在爭取這個完全相同的問題,似乎找到了解決方案。我能夠通過創建一個檢查尾部空間的模式類型來解決這個問題,然後再檢查另一個類型來檢查是否也擴展了其他類型的前導空間。這使我可以驗證沒有前導空格或尾隨空格,並且還允許只有一個字符的字符串。

<xs:simpleType name="trimmedString"> 
    <xs:restriction base="noTrailingSpaceString"> 
     <xs:pattern value="[^\s].*"/><!-- prevents leading space and requires at least one character --> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="noTrailingSpaceString"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value=".*[^\s]"/><!-- prevents trailing space and requires at least one character --> 
    </xs:restriction> 
</xs:simpleType> 
相關問題