SaxParser没有在标签之间获得完整的字符串

时间:2013-12-24 16:52:16

标签: sax

我正在使用SAX来解析xml文件。我有一个名为image的标签,其中包含一个大的base64字符串。 SAX不会返回我需要的完整字符串。这是我使用的SAX Parser。

public class ParseQuestions extends DefaultHandler{
    Question question;

    private Context context;
    public ParseQuestions(Context context){
        this.context=context;
    }

    public List<Question> questions(String filename){  
          try {  
           // obtain and configure a SAX based parser  
           SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();  

           // obtain object for SAX parser  
           SAXParser saxParser = saxParserFactory.newSAXParser();  

           // default handler for SAX handler class  
           // all three methods are written in handler's body  
           DefaultHandler defaultHandler = new DefaultHandler(){  


            String imageTag="close";  



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


             if (qName.equalsIgnoreCase("image")) {  
                  imageTag = "open";  
                 } 
            }  


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


             if (imageTag.equals("open")) {  
                  question.setImage(new String(ch, start, length)); 
             }
            }  


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


        if (qName.equalsIgnoreCase("image")) {  
            imageTag = "close";  
              } 

           };  


           AssetManager mngr = context.getAssets();
           InputStream is = mngr.open(filename);;
           saxParser.parse(is, defaultHandler);  
          } catch (Exception e) {  
           e.printStackTrace();  
          }

         }  
        } 

任何帮助将不胜感激。感谢

1 个答案:

答案 0 :(得分:1)

对于一对打开和关闭标记中的文本,可以多次调用characters方法。

您的代码假设它只被调用一次,这对于小数据通常是正确的,但并非总是如此。

您需要在该标记的startElement方法中初始化缓冲区,在characters方法中收集缓冲区,并将缓冲区转换为endElement中的字符串。