SAX解析xml中应该注意的问题


SAX中解析XML的例子一搜一大把,这就只是列出解析中需要注意的地方。首先看下面一个xml

SAX解析xml中应该注意的问题_第1张图片


这是一个很常见的xml文件,如果你用dom解析的话,不会有什么大问题,顶多有个字符集的问题,但是由于SAX是基于事件解析的,所以每当遇到开始标签,内容,结束标签,注释,dtd声明,实体等都会产生一个相应的事件。但是基于SAX来解析,遇到回车符,空格,tab键产生的空格都会触发characters事件。是不是还没看出来?不要急,其实比如说name标签结束后是有一个回车符,在下一个标签sex到来之前还有几个tab键产生的空格,这些都会触发characters事件。

我们解析的时候一个较好的方法就是遇到开始节点用一个临时变量tagName保存当前标签名。如果tagName等于某个标签的名字则给相应的字段赋值,这其中就会有个问题,就是上面红色标记的。如果在标签结束事件时没有及时给tagName清空,那么结束标签后的tab,回车符将会触发characters事件。那么会覆盖你之前在characters中的赋值,这些值会被空格覆盖,相当于清空。

其实这不是什么大的技巧,但是如果没和上面所说的联想在一起,还是要花点时间来发现这个问题的。网上说用stringbuilder,其实这个也是治标不治本,空格什么的也会被append上。所以最好还是把tagName=””,这样characters事件中就没有任何一个标签和它匹配了,所以也就不会覆盖到原来的有效值

 

下面贴上代码

 

packagecom.oppo;
 
importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;
 
importandroid.util.Log;
 
public classMyContentHandler extends DefaultHandler {
    private static final String TAG ="MyContentHandler";
    String hisName, address, money, sex,status;
    String tagName;
    StringBuilder sb = new StringBuilder();
    private String tempStr = "";
    @Override
    public void startDocument() throwsSAXException {
        Log.d(TAG,"------begin-------");
    }
 
    @Override
    public void endDocument() throwsSAXException {
        Log.d(TAG, "-------end-------");
    }
 
    @Override
    public void startElement(String uri, StringlocalName, String qName,
Attributes attributes) throws SAXException {
        tagName = localName;
        if(localName.equals("worker")) {
            for (int i = 0; i < attributes.getLength();i++) {
                Log.d(TAG,attributes.getLocalName(i) + "="
                        +attributes.getValue(i));
            }
        }
       
    }
   
    @Override
    public void endElement(String uri, StringlocalName,
String qName) throws SAXException {
       if(localName.equals("worker")){
            Log.d(TAG, "name:" +hisName
                    + "\nsex:" + sex
                    + "\nstatus:" +status
                    + "\naddress:" +address
                    + "\nmoney:" + money);
        }
        //防止标签结束后的空格引起的characters事件覆盖原来的值
        //如果不让它等于空字符串,那么结束标签后面的空格会引发characters事件,
        //此时下一个startElement事件还没有开始,tagName还在是上一个
//startElement事件中的
        //标签名,上一个characters中的对应的标签名的值势必会被空格覆盖。
       tagName ="";//这一句很重要
    }
   
    @Override
    public void characters(char[] ch, intstart, int length) throws SAXException {
        tempStr = new String(ch, start, length);
        if(tagName.equals("name")){
            hisName = tempStr;
        }elseif(tagName.equals("sex")){
            sex = tempStr;
        }elseif(tagName.equals("status")){
            status = tempStr;
        }elseif(tagName.equals("address")){
            address = tempStr;
        }elseif(tagName.equals("money")){
            money = tempStr;
        }
    }
}
 
 


你可能感兴趣的:(xml,String,attributes,联想)