【问题标题】:Trouble parsing quotes with SAX parser (javax.xml.parsers.SAXParser) on Android API 1.5在 Android API 1.5 上使用 SAX 解析器 (javax.xml.parsers.SAXParser) 解析引号时出现问题
【发布时间】:2010-04-04 04:16:52
【问题描述】:

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


          }

【问题讨论】:

  • 与其在每个组合中重复“sax”和“parser”标签,不如告诉我们是哪种语言、哪种平台以及哪种特定的解析器?
  • 对不起,我最初发布这个问题时很匆忙。我已经更新了我正在使用的代码和平台减去处理程序代码,该处理程序代码仅获取在方法中传递给它的字符数组: public void characters(char ch[], int start, int length) { ... else if (in_text) { message.setText(new String(ch, start, length)); } ... } 在节点包含引号的情况下,字符数组被错误地分割成同一个节点的多个字符数组。

标签: android saxparser


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢。我不知道这一点 - 我将相应地重构我的代码。你知道什么时候需要收集有什么规定吗?听起来这必须对任何文本字段执行,但不适用于布尔值或数字值。这是真的?或者,是否应该为每个解析的节点使用收集器?
  • 在 XML 中,实际上都是文本(至少从 SAX 解析的角度来看)。对于表示布尔值和数字的数据,它不太可能分成多个块,因为它们更小并且不包含太多的内容变化,但理论上可以拆分。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多