无法在Android API 1.5上使用SAX解析器(javax.xml.parsers.SAXParser)解析引号

时间:2010-04-04 04:16:52

标签: android saxparser

使用SAX解析器时,如果节点内容中存在“解析”,则解析失败。如何解决此问题?我是否需要转换所有字符?

换句话说,任何时候我在节点中都有引号:

 <node>characters in node containing "quotes"</node>

当Handler解析它时,该节点被屠宰成多个字符数组。这是正常的行为吗?引号为什么会引起这样的问题?

以下是我正在使用的代码:

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

 ...


HttpGet httpget = new HttpGet(GATEWAY_URL + "/"+ question.getId());
          httpget.setHeader("User-Agent", PayloadService.userAgent);
          httpget.setHeader("Content-Type", "application/xml");

          HttpResponse response = PayloadService.getHttpclient().execute(httpget);
          HttpEntity entity = response.getEntity();

          if(entity != null)
          {        
              SAXParserFactory spf = SAXParserFactory.newInstance();
              SAXParser sp = spf.newSAXParser();            
              XMLReader xr = sp.getXMLReader();            

              ConvoHandler convoHandler = new ConvoHandler();
              xr.setContentHandler(convoHandler);             
              xr.parse(new InputSource(entity.getContent()));                                


              entity.consumeContent();         

               messageList = convoHandler.getMessageList();


          }

2 个答案:

答案 0 :(得分:6)

错误发生在最近评论中引用的处理程序类中。

编写ContentHandler时常见的错误是假设只使用所有字符数据调用一次字符方法。实际上,它可以使用您必须收集的字符数据块多次调用。切入多个字符数组是正常行为。

您可能需要在startElement方法中启动收集器(可能是StringBuffer),在character方法中将数据收集到其中,然后使用endElement方法中的数据,该方法应该是注释中显示的message.setText的位置被称为。

答案 1 :(得分:1)

已经给出了正确答案(并不保证字符数据作为单个事件发送)。需要考虑的一件事是,使用带有Stax(或xmlpull)“pull”接口的解析器可能会更好;有一种方法可以强制Stax解析器确保将所有char数据报告为单个令牌(启用合并)。 Stax(或一般的拉解析器)被认为比SAX更方便使用,并且还有在Android上运行的实现(我认为android SDK甚至捆绑了xmlpull); Woodstox和Aalto应该可以工作。