2010-11-26 70 views
2

我有一些Java代碼驗證XML對XSD。我正在使用此處找到的錯誤處理程序的修改版本:http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html在驗證時捕獲並記錄所有異常。翻譯SAX異常

的錯誤是非常簡潔的,他們是這個樣子:

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:attributes&{"http://www.myschema.com/schema":sequence} 

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.myschema.com/schema":txn} 

其他消息更加神祕。

是否有一種簡單的方法可以從SAX獲得清晰明瞭的信息,從而解釋此處出錯?我想在第一個錯誤,它期待txn,而不是發現元素cID。但是......我不知道SAX可能產生的所有可能的錯誤,所以我寧願不嘗試手動創建翻譯表。

該輸出的最終用戶大多是非技術性的,所以我需要能夠生成簡單明瞭的消息,例如「元素txn無序」。

如果有幫助,下面的代碼(或多或少)這是用於驗證:

Source schema1 = new StreamSource(new File("resources/schema1.xsd")); 
Source schema2 = new StreamSource(new File("resources/schema2.xsd")); 
Source[] sources = {schema1,schema2}; 
validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(sources).newValidator(); 
ErrorHandler lenient = new ForgivingErrorHandler(); 
validator.setErrorHandler(lenient); 

別處......

StreamSource xmlSource = new StreamSource(new StringReader(XMLData)); 
try 
{ 
    validator.validate(xmlSource); 
} 
catch (SAXException e) 
{ 
    logger.error("XML Validation Error: ",e); 
} 

回答

0

嗯,看來我不得不添加xsi:schemaLocation="http://www.mycompany.com/schema resources/schema1.xsd "到XML文檔,因爲s:http://www.mycompany.com/schema是默認名稱空間:xmlns="s:http://www.mycompany.com/schema"。當然,我沒有獲得修改生成XML的工具,所以下面的醜陋的黑客是必要的:

xmlDataStr = xmlDataStr.replace("<rootNode ", "<rootNode xsi:schemaLocation=\"http://www.mycompany.com/schema resources/schema1.xsd \" "); 

...當然現在我得到雙重驗證錯誤!甲清楚和易於理解的,如:

 
cvc-complex-type.2.4.a: Invalid content was found starting with element 's:cID'. One of '{"http://www.mycompany.ca/schema":tdr}' is expected. 

緊接着:

 
http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.mycompany.com/schema":tdr} 

的雙錯誤是惱人的,但至少第一個是可用...