在Android API 1.5上使用SAX解析器(javax.xml.parsers.SAXParser)解析引号时遇到问题

在Android API 1.5上使用SAX解析器(javax.xml.parsers.SAXParser)解析引号时遇到问题,android,saxparser,Android,Saxparser,当使用SAX解析器时,如果节点内容中存在“错误”,解析将失败。如何解决此问题?是否需要转换所有”字符 换句话说,每当我在节点中有报价时: <node>characters in node containing "quotes"</node> 错误在最近的注释中引用的处理程序类中 编写ContentHandler时的一个常见错误是假设characters方法只会在所有字符数据中调用一次。事实上,它可以用您必须收集的字符数据块多次调用。切分为多个字符数组是正常行为 您可能

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

换句话说,每当我在节点中有报价时:

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

错误在最近的注释中引用的处理程序类中

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


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

错误在最近注释中引用的处理程序类中

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


您可能需要在startElement方法中启动收集器(可能是StringBuffer),在characters方法中将数据收集到其中,然后在endElement方法中使用数据,该方法应该是调用注释中显示的message.settText的地方。

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

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

而不是重复标记“SAX”和“解析器”在每一个组合中,告诉我们哪种语言、哪种平台和哪种特定的解析器如何?很抱歉我在最初发布这个问题时太匆忙了。我已经更新了我使用的代码和平台,减去处理程序代码,该处理程序代码只在方法中传递给它一个字符数组:public void characters(char ch[],int start,int length){…else if(in_text){message.setText(new String(ch,start,length));}…}对于包含引号的节点,字符数组被错误地分割为同一节点的多个字符数组。而不是重复标记“sax”和“parser”在每一个组合中,告诉我们哪种语言、哪种平台和哪种特定的解析器如何?很抱歉我在最初发布这个问题时太匆忙了。我已经更新了我使用的代码和平台,减去处理程序代码,该处理程序代码只在方法中传递给它一个字符数组:public void characters(char ch[],int start,int length){…else if(在_text中){message.setText(新字符串(ch,start,length));}在节点包含引号的情况下,字符数组被错误地分割为同一节点的多个字符数组。非常感谢。我没有意识到这一点-我将相应地重构我的代码。你知道关于何时需要收集有什么规则吗?听起来这似乎必须对任何文本字段执行,但不是for boolen或number值。这是真的吗?或者,应该为每个解析的节点使用收集器吗?在XML中,它实际上都是文本(至少从SAX解析的角度来看是这样的)。对于表示布尔值和数字的数据,不太可能拆分为多个数据块,因为它们较小,并且不包含太多内容变化,但理论上可以拆分。非常感谢。我没有意识到这一点-我将相应地重构代码。你知道关于何时需要收集有任何规则吗?确实如此像这样的UND必须对任何文本字段执行,但不能对boolen或数字值执行。这是真的吗?或者,应该为每个解析的节点使用收集器吗?在XML中,它实际上是所有文本(至少从SAX解析的角度来看).对于表示布尔值和数字的数据,不太可能分割成多个数据块,因为这些数据块较小,且内容变化不大,但理论上可以分割。
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();


          }