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

时间:2013-01-12 11:51:54

标签: java android xml xml-parsing sax

我正在创建一个Android应用程序,我正在使用SAX解析器解析XML。

在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 但它只是获得“交易”。

我该如何解决这个问题?

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

目前,我正在将XML作为InputStream&amp;使用以下代码:

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

2 个答案:

答案 0 :(得分:6)

  

这里,参数'char [] ch'应该获取整行优惠&amp;交易撮合者:技术,媒体和通讯M&amp; A但它只是获得“交易”。

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

来自documentation

  

SAX解析器可以在一个块中返回所有连续的字符数据,或者它们可以将它分成几个块;但是,任何单个事件中的所有字符都必须来自同一个外部实体,以便Locator提供有用的信息。

可能是您可以设置的功能,以确保您一次获得所有数据;我不确定。

答案 1 :(得分:0)

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

所以请尝试以下代码:

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

希望这会有所帮助。