我正在使用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中的一个值而出错。
如何解决这个问题。
答案 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提供有用的信息。“
通常,当您看到startElement
或endElement
时,您应该删除文本缓冲区。通常,当看到这些缓冲区时,您将对当前缓冲区执行某些操作。