SAX字符缓冲区大小

我试图用Sax来解析非常大的XML文件。 百万的megs。 问题是解析器一次只能读取2048个字符并终止。 我使用回调“public void characters(...)”得到了标签值的分解成两部分的问题。 例如,第一部分位于长度为4“2013”​​的位置2044上的字符数组中,第二部分位于长度为6的位置0上的“-09-30”。它应该是日期值“2013-09-30”如果收到一部分。 何可以避免这种分裂? 任何人都可以帮助我?

    public void characters(char[] ch, int start, int length) throws SAXException {
    if (Main.errorProceso==0){
    for(int i=0;i < strlista.size();i++){
    if(strlista.get(i).equals(sEtiqueta_actual)){
    if (sEtiqueta_actual.equals("Root.Header.Body.")){
    String FileNm= String.valueOf(ch, start, length);
    if (!FileNm.substring(0,2).equalsIgnoreCase("XX")){
    logger.info("El identificador no es XX");
    Main.errorProceso=1;
    i=strlista.size()+1;
    sEtiqueta_actual="";
    }
    else{
    sCod_Fichero=FileNm.substring(0,2)+XXteFormat.format(XXte);
    }
    }
    else if (sEtiqueta_actual.equals("Root.Header.Date.")){
    String aux = String.valueOf(ch, start, length).split("T")[0];
    try {
    sFec=newFormat.format(oldFormat.parse(aux));
    } catch (ParseException e) {
    logger.error(e.getLocalizedMessage());
    Main.errorProceso=1;
    }
    }
    else if (sEtiqueta_actual.equals("Root.Header2.Body2.")){
    sNum_Total=String.valueOf(ch, start, length);
    }
    else if (sEtiqueta_actual.equals("Root.Header3.Body3.Spcf.Inst.")){
    sImp =String.valueOf(ch, start, length);
    }
    .
    .
    .
    else if (sEtiqueta_actual.equals("Root.Header3.Body3.Spcf.Req.")){
    try {
    sFec2=newFormat.format(oldFormat.parse(String.valueOf(ch, start, length)));
    } catch (ParseException e) {
    logger.error(e.getLocalizedMessage());
    Main.errorProceso=1;
    }
    }
    }
    }

这只是SAX解析器工作的方式。 如果你可以增加缓冲区的大小(我不知道该怎么做),它不会有帮助; 它只会减少你将值分解成块的次数。

SAX解析器可以自由地将字符串分离到任何需要的地方(文档)。 它是为了提高效率; 避免使用内存; 为简化实施; 或者图书馆开发人员提出的任何其他原因。

所以,如果你想把你的琴弦放在一块,你需要自己做。 一个简单的解决方案,假设您从不需要使用子元素累积字符串值:

  • StringBuffer accumulator添加到实现类以及isAccumulating标志。
  • startElement ,如果该元素是感兴趣的,请设置isAccumulating标志。
  • characters ,如果设置了isAccumulating标志,则将字符附加到累加器。
  • endElement ,如果isAccumulating标志已设置,请执行您需要处理的累加字符串,然后清除标志并清空缓冲区。
  • 如果您可能需要使用子元素收集值,则可以将isAccumulating从标志更改为整数深度计数器。 如果startElement大于0, startElement递增计数器,如果元素需要收集其值,则将其设置为1。 如果计数器大于0,则characters附加字符endElement如果计数器大于零,则递减计数器,如果结果为0,则处理然后清除累加器。


    在继续进入characters()函数之前,使用String.trim()并检查String.length()>=0

    并使用stack来跟踪cData所属的标签。 然后你可以append到它。

    链接地址: http://www.djcxy.com/p/34891.html

    上一篇: SAX character buffer size

    下一篇: nolatin characters in xml output