我試圖根據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跟蹤多個類似的錯誤。
我已閱讀這些錯誤與
- 無效字符類的用法 - Validating XML using XSD with regex pattern
- 明確錨或反向引用 - Error when embedding regular expression (phone numb validate) on xml schema (xsd)
在我的XSD 有明確錨點[編輯]和非捕獲組((?!
)。
由於錯誤說
「這種表達沒有在當前選項設置支持」我怎麼
在Java中的變化驗證選項,以繞過這個錯誤,並驗證具有明確的錨XSD和反向引用?
更新
好吧,讓我說,單獨從問題的主體。通過分析特定錯誤並查找字符串的第77列,我發現以下內容(從第74列開始):(?!((N|n)
。有罪的角色是一個非捕獲組的驚歎號。我已經從XML上下文中分析了正則表達式本身,它根據數據的語義是有效的。因此,非捕獲組必須呆在那裏以排除特定的一組模式(在這種情況下,以大小寫不敏感開頭n
)
如果錨的開頭或結尾,刪除它們。你不需要它。 XML驗證器始終根據整個字符串驗證表達式。 – nhahtdh
我不允許修改架構。這是一個歐盟官方XSD。雖然刪除少量錨點可能是一個可行的解決方法(即使看看是否還有更多怪癖),但我們無法部署一個不針對官方模式進行驗證的解決方案,因爲我們的軟件生成的文檔**將被驗證由服務器。我在問是否有任何選項允許非XML風格的正則表達式 –
您是否可以將其納入問題中? – nhahtdh