2011-06-15 72 views
28

我一直在想弄清楚如何檢查XML文件的語法,確保所有標籤都關閉,沒有隨機字符等等......我所關心的是,確保文件中沒有損壞的XML。在Java中的XML語法驗證

我一直在尋找這樣的一些所謂的帖子...

...但我意識到,我不想要驗證XML文件的結構;我不想驗證對XML模式(XSD)...我只是想檢查XML語法,並確定它是否正確。

回答

40

可以檢查XML文檔是使用以下代碼合式

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setValidating(false); 
factory.setNamespaceAware(true); 

DocumentBuilder builder = factory.newDocumentBuilder(); 

builder.setErrorHandler(new SimpleErrorHandler());  
// the "parse" method also validates XML, will throw an exception if misformatted 
Document document = builder.parse(new InputSource("document.xml")); 

在上面的代碼中提到的SimpleErrorHandler類如下:

public class SimpleErrorHandler implements ErrorHandler { 
    public void warning(SAXParseException e) throws SAXException { 
     System.out.println(e.getMessage()); 
    } 

    public void error(SAXParseException e) throws SAXException { 
     System.out.println(e.getMessage()); 
    } 

    public void fatalError(SAXParseException e) throws SAXException { 
     System.out.println(e.getMessage()); 
    } 
} 

這來自this website,它提供了用Java驗證XML的各種方法。還要注意,該方法將整個DOM樹加載到內存中,如果要保存在RAM上,請參閱備註的備註。

+0

那麼這將檢查XML文件的**語法**嗎?我不想在這裏使用XML Schema ... – Hristo 2011-06-15 19:16:11

+0

是的,它會檢查文檔是否遵循XML規範中規定的「格式良好」規則 - http://www.w3.org/TR /仲良好的XML /#。這意味着所有元素必須關閉,嵌套正確等。實際上,規範定義了格式良好,因爲您不能始終使用DTD。 – 2011-06-15 19:20:31

+0

這解析它,因此檢查語法,否則它不能解析它...你怎麼處理這個文件,無論如何,你需要做這個獨立 – DaVinci 2011-06-15 19:20:36

1

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html 這有幫助嗎?它使用了非常強大的XSD。您不僅可以驗證文檔結構,還可以提供有關節點和屬性可以包含哪些類型的內容的相當複雜的規則。

+0

我不想使用XSD ...我正在照顧其他地方的那種驗證。我現在只想檢查語法。 – Hristo 2011-06-15 19:15:09

+0

你介意告訴我使用XSD的問題是什麼?你不想寫XSD?你怎麼知道你的文檔要符合什麼版本的xml? – nsfyn55 2011-06-15 19:22:33

+0

沒問題...已經有代碼可以用來驗證XSD。但它不檢查語法。 – Hristo 2011-06-15 19:26:56

3

你在問什麼是如何驗證一段內容是格式良好的XML文檔。通過簡單地讓XML解析器(嘗試)解析有問題的內容就可以輕鬆完成 - 如果存在問題,解析器將通過拋出異常來報告錯誤。真的沒有什麼更多的,所以你只需要弄清楚如何解析XML文檔。

關於唯一需要注意的是某些自稱爲XML解析器的庫並不是真正合適的解析器,因爲它們實際上可能不會驗證XML解析器必須執行的操作(按照XML規範) - 在Java中, Javolution是一個很少或沒有檢查的例子。 VTD-XML和XPP3做了一些驗證(但不是所有必需的檢查)。另一方面,Xerces和Woodstox檢查規範要求的所有內容。 Xerces與JDK捆綁在一起;另外大多數Web服務框架還捆綁了Woodstox。

由於接受的答案已經顯示瞭如何將內容解析爲DOM文檔(它以解析開始),這可能就足夠了。 唯一需要注意的是,這要求您的輸入文檔的原始大小有3-5x的可用內存。爲了解決這個限制,你可以使用流解析器,比如Woodstox(它實現標準的Stax API)。如果是這樣,只要「reader.hasNext()」返回true,就會創建一個XMLStreamReader,並調用「reader.next()」。