Java Sax解析器不完全读取一行

Java Sax解析器不完全读取一行,java,xml,sax,string-parsing,Java,Xml,Sax,String Parsing,我正试图解析一个simil-document。每个内容的节点都有更多的元组(用逗号分隔)和6或7个数字(负数和小数) 在测试中,我发现SAX的方法字符不能记住所有数据 守则: public class PenParser extends DefaultHandler { //code useless public void characters(char ch[], int start, int length) throws SAXException { //begin my

我正试图解析一个simil-document。每个内容的节点都有更多的元组(用逗号分隔)和6或7个数字(负数和小数)

在测试中,我发现SAX的方法字符不能记住所有数据

守则:

    public class PenParser extends DefaultHandler {

   //code useless

public void characters(char ch[], int start, int length) throws SAXException {
//begin my debug print
        StringBuilder  buffer=new StringBuilder ();
        for(int i=start;i<length;i++){
            buffer.append(ch[i]);
        }
        System.out.println(">"+buffer);
//end my debug print
公共类PenParser扩展了DefaultHandler{
//代码无用
公共无效字符(char ch[],int start,int length)引发异常{
//开始调试打印
StringBuilder缓冲区=新的StringBuilder();

对于(inti=start;iYes),这是非常明显的。 当解析一个节点时,可以多次调用字符

您必须使用
StringBuilder
作为成员,以字符形式追加内容,并在
endElement
中处理内容

已编辑

顺便说一句,您不需要逐个字符构建缓冲区- 这是我的字符实现(我经常使用)

……别忘了

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException 
    {
                    final String content = characters.toString().trim();
                    // .... deal with content
                    // reset characters
        characters.setLength(0);
    }

 private final StringBuilder characters = new StringBuilder(64);

是的,这很明显。 当解析一个节点时,可以多次调用字符

您必须使用
StringBuilder
作为成员,以字符形式追加内容,并在
endElement
中处理内容

已编辑

顺便说一句,您不需要逐个字符构建缓冲区- 这是我的字符实现(我经常使用)

……别忘了

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException 
    {
                    final String content = characters.toString().trim();
                    // .... deal with content
                    // reset characters
        characters.setLength(0);
    }

 private final StringBuilder characters = new StringBuilder(64);

剪切是随机的:有时不发生,有时发生在107个字符之后,有时发生在3000个字符之后:行的长度不是静态定义的。剪切是随机的:有时不发生,有时发生在107个字符之后,有时发生在3000个字符之后:行的长度不是静态定义的。characters.append(新字符串(ch,start,length));已保存的mecalling设置长度(0)对于像ContentSubcentMoreContent这样的东西不起作用,对吗?不,这个简单的解决方案不起作用。我认为无论如何,那时需要另一种策略——将内容+morecontent放在一起,而中间没有分包,这没有多大意义,不是吗?好的-解决方案可以处理中的内容另一个方法是从startElement和endElement调用的。所以-这个解决方案对我来说很有效,因为我从不定义包含交叉内容的XML结构。垃圾字符串没有任何意义。StringBuilder有一个附加,它接受与characters函数相同的参数(char[],offset,length)。我也不会使用trim()因为内容中的空白被认为是重要的,应该保留。characters.append(新字符串(ch,start,length));saved mecalling setLength(0)对于像ContentSubcentMoreContent这样的东西不起作用,对吗?不,这个简单的解决方案不起作用。我认为无论如何,那时需要另一种策略——将内容+morecontent放在一起,而中间没有分包,这没有多大意义,不是吗?好的-解决方案可以处理中的内容另一个方法是从startElement和endElement调用的。所以-这个解决方案对我来说很有效,因为我从不定义包含交叉内容的XML结构。垃圾字符串没有任何意义。StringBuilder有一个附加,它接受与characters函数相同的参数(char[],offset,length)。我也不会使用trim()因为内容中的空白被认为是重要的,应该保留。