2013-04-25 232 views
0

示例XML,解析XML使用SAX

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <Issue> 
    <Snippet>  
      sri;; 
      hiil 
      bye; 
      tc; 
    </Snippet> 
    </Issue> 

是否有可能獲得片斷標籤內的整個人物?

如果是這樣的實施方式中,

public void startElement(String uri, String localName, 
      String qName, Attributes attributes) throws SAXException { 
     temp = ""; 
     if (qName.equalsIgnoreCase("Issue")) { 
      acct = new Account(); 

     public void endElement(String uri, String localName, String qName) 
      throws SAXException { 

     if (qName.equalsIgnoreCase("Issue")) { 
      // add it to the list 
      accList.add(acct); 
     else if(qName.equalsIgnoreCase("Snippet")) 
      { 
       acct.setPrimarySnippet(temp); 
      } 

O/P爲Tc;但是我需要在代碼片段中使用整個值來打印。

使用arraylist。用於鏈接和檢索值的Getter和setter方法。

+0

你是如何獲得你在endElement()方法中設置的值「temp」? – rhinds 2013-04-25 15:14:56

回答

2

使用方法「字符」。

http://docs.oracle.com/javase/1.5.0/docs/api/org/xml/sax/helpers/DefaultHandler.html#characters(炭[],INT,INT)

意思是,你必須實現startElementendElement方法(來表明你正在進入和離開的「片段」標籤,然後characters方法將返回字符。

public void startElement(String uri, String localName, 
      String qName, Attributes attributes) throws SAXException { 
     temp = ""; 
     if (qName.equalsIgnoreCase("Issue")) { 
      someFlagVariable = true; 

public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
     if (qName.equalsIgnoreCase("Issue")) { 
      someFlagVariable = false; 
     } 
} 
public void characters(char[] ch, 
        int start, 
        int length) 
      throws SAXException{ 
    if (someFlagVariable){ 
     String content = new String(ch, start, length).trim(); //this is your content 
    } 
} 
+1

您應該將ch的字符寫入StringBuilder並在endElement上創建字符串。這確保獲得完整的字符串,而不僅僅是它的一大塊。 – Stephan 2013-04-25 15:24:57

+0

好的。我知道了 。謝謝@ vlad-ardelean – sreram 2013-04-26 15:03:54

0

是。

你應該抓住「臨時」的價值(你的價值設置爲主要片段)在characters()方法中。

但是,您應該意識到,不會保證何時會執行characters(),並且可能會在單個節點內多次調用它。因此,在重寫characters()方法的過程中,您需要構建一個字符串 - 這樣,當您到達endElement()時,您將擁有完整的值。

您可以看到一個示例實現here

但是你基本上想要的東西,如:

StringBuffer chars = new StringBuffer(); 

public void startElement(String uri, String localName, String qName, Attributes atts) { 
    chars = new StringBuffer(); 
} 

public void endElement(String uri, String localName, String qName) throws SAXException { 
    if (qName.equalsIgnoreCase("Issue")) { 
     // add it to the list 
     accList.add(acct); 
    else if(qName.equalsIgnoreCase("Snippet")){ 
     acct.setPrimarySnippet(chars); 
    } 
} 

public void characters(char ch[], int start, int length) { 
    chars.append(new String(ch, start, length)); 
} 

(雖然注意,如果你只關心葉子節點文本上面只適用 - 因爲我們是如果你想要非葉節點的文本,那麼你需要在startElement()方法中引入標誌,這樣你才能在正確的時間重新實例化字符串緩衝區)

+0

謝謝rhinds。它運作良好:)。繼續捐助 – sreram 2013-04-26 13:17:55

0

1)打印內部片段牛逼的文字,你應該實現

public void characters(char ch[], int start, int length) 

2)中摘錄的文字中包含的幾行,用SAX你將分別獲得每行,這種行爲是在SAX API文檔,這可能取決於提供商,但至少使用JDK默認的SAX解析器,您無法更改它。試試StAX,它有解決這個問題的XMLInputFactory.IS_COALESCING選項。

+0

是的,我已經實施了字符方法,對不起,我忘記了包括在這裏。然而只有snippet標籤的最後一行正在被打印。這是SAX解析器的默認行爲嗎?StAX是否符合我的要求? – sreram 2013-04-26 05:38:39

+0

使用StAX更容易。但是SAX也會起作用,你需要收集SAX發送給StringBuilder中字符()的塊,就像rhinds建議的那樣。 – 2013-04-26 05:43:14

+0

好。除了我的實現之外是否可以使用StAX,或者我需要使用除SAX之外的StAX來處理整個事件? – sreram 2013-04-26 13:10:14