1

使用 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();


          }
4

2 回答 2

6

该错误出现在您最近的评论中引用的处理程序类中。

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

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

于 2010-04-05T02:59:44.217 回答
1

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

于 2010-12-17T18:07:34.470 回答