SAX 的 characters() 方法未解析 Text 节点中的特殊字符

Posted

技术标签:

【中文标题】SAX 的 characters() 方法未解析 Text 节点中的特殊字符【英文标题】:Special characters in Text node not getting parsed by SAX's characters() method 【发布时间】:2012-12-26 21:56:13 【问题描述】:

我正在制作一个使用 SAX 解析器解析 XML 的 android 应用程序。

在 XML 中有标签:

<title>Deals &amp; Dealmakers: Technology, media and communications M&amp;A </title>

如您所见,它包含一些特殊的章程,例如 &amp;amp;

问题是我使用的是 SAX 的隐式方法:

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

这里,参数 'char[] ch' 应该获取整行 Deals &amp;amp; Dealmakers: Technology, media and communications M&amp;amp;A 但它只是获得“交易”。

我该如何解决这个问题?

一个问题可能是因为我将 XML 传递给 SAX 解析器的方式。我需要更改编码或格式吗?

目前,我将 XML 传递为 InputStream & 使用以下代码:

HttpResponse httpResponse = utils.sendRequestAndGetHTTPResponse(URL);
if (httpResponse.getStatusLine().getStatusCode() == 200) 
    HttpEntity entity = httpResponse.getEntity();
    InputStream in = entity.getContent();
    parseResponse(in);



// Inside parseResponse method:
try 
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();
    XMLReader xmlReader = sp.getXMLReader();

    MyHandler handler = new MyHandler();
    xmlReader.setContentHandler(handler);
    xmlReader.parse(new InputSource(in));
 catch (Exception e) 

【问题讨论】:

参考此链接***.com/questions/2838099/… & ***.com/questions/8134317/sax-parsing-of-character 【参考方案1】:

这里,参数 'char[] ch' 应该获取整行 Deals & Dealmakers: Technology, media and Communications M&A 但它只获取“Deals”。

您似乎假设您将在一次通话中获得整个文本。对此没有任何保证。我强烈怀疑您的 characters 方法会为同一个文本节点多次调用,这对解析器来说是有效的。您需要确保您的代码能够处理这些问题。

来自documentation:

SAX 解析器可以在单个块中返回所有连续的字符数据,也可以将其拆分为多个块;但是,任何单个事件中的所有角色都必须来自同一个外部实体,以便定位器提供有用的信息。

可能您可以设置一项功能,以确保一次性获取所有数据;我不确定。

【讨论】:

感谢***.com/a/2838338/1433826中建议的使用stringbuilder的追加方法【参考方案2】:

我猜 UTF-8 正是问题所在。在文件中,您解析的编码定义为 ISO-8859-1

所以只需尝试以下代码:

InputSource is = new InputSource(yourInputStream);
is.setEncoding("ISO-8859-1");
xmlReader.parse(is);

希望这会有所帮助。

【讨论】:

以上是关于SAX 的 characters() 方法未解析 Text 节点中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

Java SAX 解析

python使用SAX解析xml

使用 SAX 解析器时如何获取父节点?

在 SAX 解析器中删除空格

如果输入文件中未指定 DTD,如何强制 SAX 解析器使用 DTD?

sax的解析原理基础