chenrenxiang 2015-07-21 16:01 采纳率: 14.3%
浏览 2005

使用DefaultHandler2 进行 SAX解析 出错

因为我是第一次使用DefaultHandler2这个类 sax解析带有CDATA标签的xml文件,
还不太熟悉,不知道我这样用对不对。
xml文件内容如下:图片说明
我只需要得到 url 标签下 encode、decode、lrcid这三个标签里面的内容。
下面是Java代码
public class MyDefaultHandler2 extends DefaultHandler2{

String currentElement=null;
int flag=0;
String cData;
int count=0;

@Override
public void endCDATA() throws SAXException {
    // TODO Auto-generated method stub
    super.endCDATA();
}

@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {
    // TODO Auto-generated method stub
    count++;
    System.out.println("xiaoqiang:"+count);
    if(flag==1&&currentElement.equals("encode")){
        cData=new String(ch,start,length);
        System.out.println("xiaoqiang:"+cData);
    }else if(flag==1&&currentElement.equals("decode")){
        cData=new String(ch,start,length);
        System.out.println("xiaoqiang:"+cData);
    }else if (flag==1&&currentElement.equals("lrcid")) {
        String thedata=new String(ch,start,length);
        System.out.println("xiaoqiang:"+thedata);
    }
    super.characters(ch, start, length);
}

@Override
public void endDocument() throws SAXException {
    // TODO Auto-generated method stub
    super.endDocument();
}

@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {
    // TODO Auto-generated method stub
    if(localName.equals("url")){
        flag=0;
    }else {
        currentElement=null;
    }
    super.endElement(uri, localName, qName);
}

@Override
public void startDocument() throws SAXException {
    // TODO Auto-generated method stub
    super.startDocument();  
}

@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
    // TODO Auto-generated method stub
    if(localName.equals("url")){
        flag=1;
    }else if(localName.equals("encode")){
        currentElement="encode";
        startCDATA();
    }else if(localName.equals("decode")){
        currentElement="decode";
        startCDATA();
    }else if(localName.equals("lrcid")){
        currentElement="lrcid";
    }
    super.startElement(uri, localName, qName, attributes);
}

@Override
public void startCDATA() throws SAXException {
    // TODO Auto-generated method stub
    cData=null;
    super.startCDATA();
}

}

最后是loagCat的信息:
图片说明
我在每一次触发characters方法的时候记一次数,可以看到是第四次的时候出问题的。而且 encode 和 decode 标签里面的内容也成功获取,而 lrcid 标签里的内容则没有获取。那么应该是解析到 lrcid 标签的时候出了错误。
想请问如何解决这个问题,为什么会出错?

  • 写回答

2条回答 默认 最新

  • chenrenxiang 2015-07-21 17:50
    关注

    是我太蠢了,以前我都是用整数标记标签。这次用String currentElement标记当前标签,当不是我需要的标签时,就设为null。这样就抛出了NullPointerException异常。
    当currentElement为空时拿它去与另外一个String值比较,这是错误的。所以应该String currentElement=“”;这样就不会抛异常。

    评论

报告相同问题?

悬赏问题

  • ¥15 对于这个问题的代码运行
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败