2012-07-24 42 views

回答

1

只要處理endDocument,如果被調用,那麼它是格式良好的。

1

您可以處理startElement(),endElement()endDocument(),或者只處理endDocument()。如果文檔格式不正確,endDocument()應該引發異常。然而,對於學習的緣故,我將展示一些例子:

public class MyParser extends DefaultHandler { 
    Stack<String> stk; 

    //... 

    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { 
     stk.push(name); 
    } 

    public void endElement(String uri, String localName, String name) throws SAXException { 
     if(stk.pop().equals(name)) { 
      // Input is well formed for each tag 
     } 
     else { 
      // Not well-formed 
     } 
    } 
} 
+0

是的,但我不知道的開始元素,因爲它可以是一百...但我需要知道的第一個元素的XML文件打開並關閉 – Podge 2012-07-24 15:13:09

+0

@ user1381564:我的答案更新 – 2012-07-24 15:20:16

1

像你想使用DOM解析這聽起來更多:

public class MyParser extends DefaultHandler { 

    private String firstElement; 
    private String lastElement; 

    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { 
     if(firstElement == null) { 
      firstElement = name; 
     } 
    } 
    public void endElement(String uri, String localName, String name) throws SAXException { 
     lastElement = name; 
    } 
    public void endDocument() { 
     if(lastElement.equals(firstElement)) { 
      // Well formed input 
     } 
    } 
} 

您也可以確保所有元素用棧關閉。

如果您使用sax解析,您實際上是在說您不想一次處理(加載到內存中)整個文檔。如果您搜索第一個標籤結束(根標籤),您將立即掃描整個文檔,並放棄SAX的好處。

當您加載文檔並且格式不正確時,DOM解析也會丟失。所以不需要手動檢查根標籤是否關閉。

+0

我在想DOM會現在更合適......但是,改變它的努力太多了,因爲我有薩克斯解析器做得如此之多......當endDocument()運行?是在文檔實際結束還是讀取第一個標籤的結束標籤? – Podge 2012-07-24 15:17:13

+0

我無法向您保證SAX for Java的工作原理,我只在其他語言中使用SAX,在Java中使用DOM。但我會假設在根標籤關閉時應該觸發endDocument。不是當你到達文件結束時。 – 2012-07-24 15:19:57

+0

是啊你的權利,如果結束標記不存在它會引發異常 – Podge 2012-07-24 15:34:41

0

使用String實例變量將SAX ContentHandler留空。實現startElement標籤,只有當實例變量爲null時,纔會獲取標籤的名稱並將實例變量設置爲等於它。現在,您可以使用該contentHandler運行解析器,如果它正常完成(不拋出SAX異常),則解析器找到結束標記,並且您可以從contentHandler中的實例變量中檢索外部標記的名稱。

0

如有標籤不打開或關閉,因此不需要它處理....因此,如果XML文件是錯誤/損壞SAX解析器會拋出異常SAX解析器實際上拋出一個異常