2013-10-24 82 views
0

我想在Java中寫一些接收XML字符串並根據XSD模式驗證它的東西,並對一些簡單的常見錯誤進行自動錯誤處理,並輸出一個固定的XML字符串。Java XML解析/驗證錯誤處理

我遇到了Validator.validate()函數的SAX ErrorHandler接口,但這似乎主要是爲了報告異常,我無法弄清楚如何從中修改XML,除了獲取行/列號解決問題將非常繁瑣。

我還發現了Validator.validate()函數,它有一個源代碼和一個結果,並返回增強的XML,據我所知,它只是填充缺少的具有默認值的屬性,這是我需要做的一部分。

但我還需要沿着修復缺少的開始或結束標記,糾正一個字母拼寫錯誤的標記等等。有很多「Handler」接口(ValidationHandler,ContentHandler,EntityResolver),我不確定要深入研究哪些接口,所以如果有人能指出我的方向是正確的,那就太棒了(我不需要詳細的代碼示例)。我也不確定XMLReader如何適應這一切。

+0

請不要張貼作爲文本的一個巨大的塊,它有點痛苦閱讀。 –

回答

1

要處理錯誤,您必須實現接口ErrorHandler或擴展DefaultHandler輔助類並重新定義error方法。這是調用驗證錯誤的方法。如果你想更精確,我認爲你將不得不分析錯誤信息。我不認爲SaX會給你一些容易解決的錯誤。

順便說一句,請注意,爲了驗證XSD,您不應該使用方法setValidating。請參閱下面的代碼。該setValidating方法

Java的文檔(1.7)說:

注意,「驗證」在這裏的意思是在XML建議中定義的驗證解析器。換句話說,它本質上只是控制DTD驗證。 (JAXP 1.2中定義的遺留兩個屬性除外)。

要使用現代模式語言(如W3C XML Schema或RELAX NG代替DTD),可以將分析器配置爲非驗證分析器,方法是將setValidating boolean)方法爲false,然後使用setSchema(Schema)方法將模式關聯到解析器。

import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 
// ... 
public static void main(String args[]) throws Exception { 
     if (args.length == 0 || args.length > 2) { 
      System.err.println("Usage: java Validator <doc.xml> [<schema.xsd>]"); 
      System.exit(1); 
     } 
     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants. W3C_XML_SCHEMA_NS_URI); 
     String xsdpath = "book.xsd"; 
     if (args.length == 2) { 
      xsdpath = args[1]; 
     } 
     Schema s = sf.newSchema(new File(xsdpath)); 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     factory.setValidating(false); 
     factory.setNamespaceAware(true); 
     factory.setSchema(s); 

     XMLReader parser = factory.newSAXParser().getXMLReader(); 
     parser.setFeature("http://xml.org/sax/features/namespaces", true); 
     parser.setFeature("http://xml.org/sax/features/namespace-prefixes", false); 

     PrintStream out = new PrintStream(System.out, true, "UTF-8"); 
     parser.setContentHandler(new MyHandler(out)); 
     parser.setErrorHandler(new DefaultHandler()); 
     parser.parse(args[0]); 
    } 
} 
+1

感謝您的代碼和關於setValidating的部分,我不知道這一點。 – KingJustinian

-1

我用DocumentBuilderFactorysetValidating(true)來生成一個XML驗證解析器的實例(即DocumentBuilder)。

請注意,驗證和非驗證XML解析器都將驗證XML是否「格式良好」(例如,結束標記等)。 「驗證」是指檢查XML是否符合DTD或模式。

+0

'setValidating(true)'特別針對DTD而不是W3C XML模式進行驗證。另請注意,模式可以是DTD,XSD,... DTD,W3C XML模式,Relax NG,Schematron都是模式語言。 – lkuty