SAXXMLJava实体问题

SAXXMLJava实体问题,java,xml,sax,Java,Xml,Sax,我对SAX和Java有问题 我正在解析dblp数字图书馆数据库xml文件(其中列举了期刊、会议、论文)。XML文件非常大(>700MB) 但是,我的问题是,当回调characters()返回时,如果检索到的字符串包含多个实体,则该方法只返回从找到的最后一个实体字符开始的字符串 i、 e.:Rü;diger Mecke是在标记之间保留的原始作者姓名 u diger Mecke就是结果 (从characters(ch[],start,length)方法返回的字符串) 我想知道: 如何防止解析

我对SAXJava有问题

我正在解析dblp数字图书馆数据库xml文件(其中列举了期刊、会议、论文)。XML文件非常大(>700MB)

但是,我的问题是,当回调characters()返回时,如果检索到的字符串包含多个实体,则该方法只返回从找到的最后一个实体字符开始的字符串

i、 e.:
Rü;diger Mecke
是在
标记之间保留的原始作者姓名

u diger Mecke
就是结果

(从characters(ch[],start,length)方法返回的字符串)

我想知道:

  • 如何防止解析器自动解析实体
  • 如何解决前面描述的截断字符问题
  • 我认为你不能关闭实体解析

  • characters方法可以为单个标记多次调用,您必须在多次调用中收集字符,而不是期望它们一次全部到达

  • characters()
    不能保证在一次调用中返回所有字符。从Javadoc:

    解析器将调用此方法来报告每个字符块 数据。SAX解析器可以在单个文件中返回所有连续字符数据 块,或者他们可以把它分成几个块

    您需要附加在所有调用中返回的字符,例如:

    private StringBuffer tempValue = new StringBuffer();
    
    startElement()
    {
        tempValue.setLength(0); // clear buffer...
    }
    
    characters(characters(char[] ch, int start, int length)
    {
        tempValue.append(ch, start, length); // append to buffer
    }
    
    endElement()
    {
        String value = tempValue.toString(); // use characters in buffer...
    }
    

    好的,但为什么characters方法只对包含实体的文本节点调用多次?我不相信这是唯一会导致多次调用的方法,但我知道它在大多数sax实现中都会发生。长块也可能被分割。什么决定解析器返回的块?我的文件包含一个“,”这似乎是对解析的限制。