2

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

在 XML 中有标签:

<title>Deals &amp; Dealmakers: Technology, media and communications M&amp;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 但它只获取“Deals”。

我该如何解决这个问题?

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

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

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) {
}
4

2 回答 2

6

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

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

文档中:

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

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

于 2013-01-12T11:54:27.107 回答
0

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

所以只需尝试以下代码:

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

希望这可以帮助。

于 2013-01-12T12:08:00.743 回答