Java sax解析器bug

时间:2014-12-17 08:49:33

标签: java xml sax saxparser

我正在使用java sax解析器并且我覆盖

@Override
public void characters(char ch[], int start, int length) throws SAXException {
    value = new String(ch, start, length);

在某些情况下,数组ch包含qName元素但不包含整个值。

示例:

ch = [... , x, s, d, :, n, a, m, e, >, 1, 2, 3]

但xsd:name的实际值是123456789

修改

String responseString = Utils.getXml(url);

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
handler = new SimpleHandler();
saxParser.parse(new InputSource(new StringReader(responseString)), handler);

List<Entit> list = handler.getList();

我有像这样的xml(当然原来的xml要大得多)

<root>
   <el>
     <xsd:name>11111111</xsd:name>
   </el>
   <el>
     <xsd:name>22222222</xsd:name>
   </el>
   <el>
     <xsd:name>123456789</xsd:name>
   </el>
   <el>
     <xsd:name>333333333</xsd:name>
   </el>
</root>

我只是因为xml中的一个值而出错。

如何解决这个问题。

1 个答案:

答案 0 :(得分:9)

characters方法必须返回整个字符集。每次调用characters时都需要存储结果,如:

final StringBuilder sb = new StringBuilder();

@Override
public void characters(char ch[], int start, int length) throws SAXException {
    sb.append(ch, start, length);
}

然后,当您找到结束元素标记或begin元素标记或任何情况时,您需要重置StringBuilder(或您正在使用的任何内容)。

阅读characters的规范:

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

通常,当您看到startElementendElement时,您应该删除文本缓冲区。通常,当看到这些缓冲区时,您将对当前缓冲区执行某些操作。