Java SAXParser在解析超过1033个字符的CDATA时获得ArrayIndexOutOfBoundsException

Java SAXParser在解析超过1033个字符的CDATA时获得ArrayIndexOutOfBoundsException,java,xml,Java,Xml,我想使用XML作为存储文章的小型数据库。 当我使用SAXParser解析这个XML时,我得到了一个ArrayIndexOutOfBoundsException 我举了一个小例子。 XML文件: <?xml version="1.0" encoding="UTF-8"?> <a> <b> <c> <![CDATA[ 11111111111111111111111111111111111111111

我想使用XML作为存储文章的小型数据库。 当我使用SAXParser解析这个XML时,我得到了一个ArrayIndexOutOfBoundsException

我举了一个小例子。 XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<a>
    <b>
        <c>
            <![CDATA[
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111
]]>
        </c>
    </b>
</a>
解析器处理程序:

package com.sumy.xmlwikimanager.dao;

import com.sumy.xmlwikimanager.bean.WikiItem;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Created by Sumy on 2015/11/27 0027.
 */
public class DatabaseParserHandler extends DefaultHandler {

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("startElement: uri[" + uri + "] localName[" + localName + "] qName[" + qName + "]"); 
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        System.out.println(length);
    }
}
java只有一个测试方法:

package com.sumy.xmlwikimanager.dao;

import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
/**
 * Created by Sumy on 2015/11/27 0027.
 */
public class XMLUtil {
    public static void parserXML(File file) {
        try {

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            parser.parse(file, new DatabaseParserHandler());
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {

        parserXML(new File("Category.xml"));

    }
}
I测试:
如果CDATA内容的长度小于1034,则程序工作正常。当我添加一些字符时,ArrayIndexOutOfBoundsException将抛出


我的程序有什么问题吗?

您的实现没有问题。由于文档格式良好,因此不应导致错误


这似乎是解析器实现的一个bug。已经有一个用于显示相同stacktrace的解析器的实例。

您可以显示您的parseXML方法/XMLUtil类吗?@eis我已经编辑了帖子,并添加了XMLUtil类。似乎正在使用的解析器实现是“XPP XML Pull parser”。有没有其他用于XML解析器的jar库?我用过Dom4j,但它也有这个问题。谢谢@eis。我使用org.w3c.dom解析XML,并使用DomReader将org.w3c.dom.Document转换为Dom4j文档,避免使用SAXReader。它几乎可以正常工作。谢谢@wero。找不到解决此问题的好方法,请避免在代码中使用“XPP XML Pull Parser”。@sumy您已经在使用接口
javax.XML.parsers.SAXParser
,而不是一个好的特定实现。JDK通常提供与XPP Pull解析器不同的实现。所以你必须学会如何摆脱XPP。也许从项目中删除
pull parser xx.jar
同样简单。请对此进行研究,以了解如何选择实现。如果没有其他帮助,发布一个新问题。
package com.sumy.xmlwikimanager.dao;

import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
/**
 * Created by Sumy on 2015/11/27 0027.
 */
public class XMLUtil {
    public static void parserXML(File file) {
        try {

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            parser.parse(file, new DatabaseParserHandler());
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {

        parserXML(new File("Category.xml"));

    }
}