Java sax解析器bug

use*_*967 1 java xml sax saxparser

我正在使用java sax解析器,我重写

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

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

例:

ch = [... , x, s, d, :, n, a, m, e, >, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

但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();
Run Code Online (Sandbox Code Playgroud)

我有像这样的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>
Run Code Online (Sandbox Code Playgroud)

我只是为xml中的一个值得到错误.

如何解决这个问题.

Jar*_*red 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);
}
Run Code Online (Sandbox Code Playgroud)

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

阅读规范characters:

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

通常,您应该做的是在看到startElement或时删除文本缓冲区endElement.通常,当看到这些缓冲区时,您将对当前缓冲区执行某些操作.