2011-07-04 33 views
1

解析XML文件,鑑於此XML文件:Confussion在Java

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <data> 
     <track clipid="1"> 
     <url>http://www.emp3world.com/to_download.php?id=33254</url> 
     <http_method>GET or POST</http_method> 
     <post_body>a=1&b=2&c=3</post_body> 
     </track> 
    </data> 
</root> 

我所追求的是從這個XML文件打印是這樣的:

ID: 1 
URL: http://www.emp3world.com/to_download.php?id=33254 
Http method: GET or POST 

目前,這是我的原始處理程序代碼:

class MyHandler extends DefaultHandler 
{ 
    String str = ""; 
    StringBuilder s = new StringBuilder(); 
    public void startElement(String namespaceURI, String sName, String qName, Attributes atts) 
    { 
     if(qName.equals("track")) 
     { 
      s.append("ID: ").append(atts.getValue("clipid")).append("\n"); 
     } 
     if(qName.equals("url")) 
     { 
      s.append("URL: "); 
     } 
     if(qName.equals("http_method")) 
     { 
      s.append("Http method: "); 
     } 

    } 

    public void endElement(String uri, String localName, String qName) 
    { 
     if(qName.equals("url")) 
     { 
      s.append(str).append("\n"); 
      str = ""; 
     } 
     if(qName.equals("http_method")) 
     { 
      s.append(str).append("\n"); 
      str = ""; 
     } 
     System.out.println(s); 
    } 

    public void characters(char[] ch, int start, int length) throws SAXException { 
     str = new String(ch, start, length); 
    } 
} 

我的問題是,它總是打印結果4次(第一次沒有Http方法字段。這對所有Sax Parsers初學者來說都是一個問題。
我知道startElement,endElement,characters函數是做什麼的,但正如你所看到的,我不知道如何正確使用它們。我應該在我的代碼中更改什麼,以便我可以獲得正確的輸出結果?

謝謝。

+0

4次因爲使用從'endElement'而不是'endDocument'調用'System.out.println(s)'。正如NathanHughes提到的,你必須將文本內容累加到StringBuilder中,因爲它可能由多個'字符'表示,請致電 –

+0

好的,謝謝你解釋了 – Kobe

回答

4

問題是你的字符方法。它的機身改爲

s.append(new String(ch, start, length)); 

然後加入這一行的startElement

s.setLength(0); 

的開始,你應該會看到一些輸出。

這裏是the Java tutorial on SAX不得不說的人物方法:

解析器不需要在同一時間返回字符的任何具體數量。解析器可以一次返回任何一個字符,最多可以有幾千個字符,並且仍然是符合標準的實現。因此,如果您的應用程序需要處理它所看到的字符,那麼讓characters()方法在java.lang.StringBuffer中累積字符並且僅在確定已找到所有字符時纔對它們進行操作是明智的。

+0

如何清除StringBuilder,因爲我看到它沒有clear()方法 ? – Kobe

+0

@vBx:對不起,以爲它。您可以將其長度始終設置爲0. –

+0

with setLength(0) –