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 & Dealmakers: Technology, media and communications M&A </title>
如您所见,它包含一些特殊的章程,例如 &amp;
问题是我使用的是 SAX 的隐式方法:
@Override
public void characters(char[] ch, int start, int length) throws SAXException
这里,参数 'char[] ch' 应该获取整行 Deals &amp; Dealmakers: Technology, media and communications M&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 节点中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章