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=“”;这样就不会抛异常。

    评论

报告相同问题?

悬赏问题

  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容