2012-09-05 50 views
0

我有一個Android應用程序,它使用SAXParser來解析XML。一切都很順利,除了一些文本被複制和修剪。例如:「就這樣做,即使你不知道如何!」變成「不知道如何!」Android SAXParser殘羹剩飯

這是DefaultHandler代碼。 10倍!

DefaultHandler handler = new DefaultHandler() 
    { 
     Praise praise; 
     String elementValue = null; 
     Boolean elementOn = false; 

     @Override 
     public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException 
     { 

      if (localName.equals("praise")) 
      { 
       praise = new Praise(); 
       elementOn = true; 
      } 
     } 

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

      // elementOn = false; 

      if (localName.equals("PRAISE_TEXT")) 
      { 
       praise.setPraiseText(elementValue); 
      } 
      if (localName.equals("MOOD")) 
      { 
       praise.setMood(elementValue); 
      } 
      if (localName.equals("RATING")) 
      { 
       praise.setRating(Integer.valueOf(elementValue)); 
      } 
      if (localName.equals("praise")) 
      { 
       elementOn = false; 
       if (update) 
       { 
        if (database.getPraiseByText(praise.getPraiseText(), db) == null) 
        { 
         database.addPraise(db, praise.getPraiseText(), praise.getMood(), 
          Integer.valueOf(praise.getRating())); 
        } 
       } 
       else 
        database.addPraise(db, praise.getPraiseText(), praise.getMood(), 
         Integer.valueOf(praise.getRating())); 
      } 
     } 

     @Override 
     public void characters(char[] ch, int start, int length) throws SAXException 
     { 
      // StringBuffer b = new StringBuffer(); 
      if (elementOn) 
      { 
       elementValue = new String(ch, start, length);}}}; 

回答

0

在SaxParsing,你沒有保證characters將只調用一次!

對於這一點,你應該串連您收到withing相同的元素

這是一個只是你的一個小修改代碼的所有字符。您應該使用StringBuilder,而不是使用字符串(:

DefaultHandler handler = new DefaultHandler() 
    { 
     Praise praise; 
     String elementValue = null; 
     Boolean elementOn = false; 

     @Override 
     public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException 
     { 
      elementValue = new String(); 

      if (localName.equals("praise")) 
      { 
       praise = new Praise(); 
       elementOn = true; 
      } 
     } 

     @Override 
     public void endElement(String uri, String localName, String qName) throws SAXException 
     { 
      if (localName.equals("PRAISE_TEXT")) 
      { 
       praise.setPraiseText(elementValue); 
      } 
      if (localName.equals("MOOD")) 
      { 
       praise.setMood(elementValue); 
      } 
      if (localName.equals("RATING")) 
      { 
       praise.setRating(Integer.valueOf(elementValue)); 
      } 
      if (localName.equals("praise")) 
      { 
       elementOn = false; 
       if (update) 
       { 
        if (database.getPraiseByText(praise.getPraiseText(), db) == null) 
        { 
         database.addPraise(db, praise.getPraiseText(), praise.getMood(), 
          Integer.valueOf(praise.getRating())); 
        } 
       } 
       else 
        database.addPraise(db, praise.getPraiseText(), praise.getMood(), 
         Integer.valueOf(praise.getRating())); 
      } 
     } 

     @Override 
     public void characters(char[] ch, int start, int length) throws SAXException 
     { 
      // StringBuffer b = new StringBuffer(); 
      if (elementOn) 
      { 
       elementValue = elementValue + new String(ch, start, length); 
      } 
     } 
    }; 
0

這個問題常常表現出SaxParsing的實際問題是,它通過 現在「/ N」 &字符串的只有最後一部分是供我們打破了字符串。來解決,採取不同的布爾的標籤(含問題或全部)。

在的startElement方法使培訓相關布爾值true。

if (localName.equals("PRAISE_TEXT")) 
{ 
    isPrase= true' 
    praise.setPraiseText(elementValue); 
} 
在endElemet方法

使培訓相關布爾真假。在字符

if (localName.equals("PRAISE_TEXT")) 
{ 
    isPrase= false; 
    praise.setPraiseText(elementValue); 
} 

布爾方法檢查這樣的:

if(isPrase) 
{ 
elementValue = new String(ch, start, length);}}}; 

}