【问题标题】:SAX XML Java Entities problemSAX XML Java 实体问题
【发布时间】:2010-12-29 17:03:58
【问题描述】:

我对 SAXJava 有疑问。

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

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

即:Rüdiger Mecke<author> 标签之间的原作者姓名

üdiger Mecke 是结果

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

我想知道:

  1. 如何防止 PArser 自动解析实体?
  2. 如何解决前面描述的截断字符问题?

【问题讨论】:

    标签: java xml sax


    【解决方案1】:

    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...
    }
    

    【讨论】:

    • 是什么决定了解析器返回的块?我的文件包含一个 ",这似乎对解析进行了分隔。
    【解决方案2】:
    1. 我认为您不能关闭实体解析。

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

    【讨论】:

    • 好的,但是为什么只有文本节点持有实体才会多次调用characters方法?
    • 我不相信这是唯一会导致多次调用的事情,但我知道它在大多数 sax 实现中都会发生。长块也可能被拆分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2012-09-17
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多