全国免费热线:
XML的解析与生成
作者:中国IT实验室 点击:5319次 日期:2012-09-14
字号::T | T
欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入
    Android平台上可以使用 Simple API for XML (SAX), Document Object Model(DOM) 和Android 附带的pull解析器 解析XML文件
   
    众所周知,DOM解析方式很耗内存, 优先使用SAX或者pull
   
    SAX:
   
    解析速度快,占用内存少,采用事件驱动,即不需要加载完整个文档,而是按内容顺序解析文档,在此过程中,其会判断当前读到的内容是否符合XML语法定义,如果符合就会触发事件,所谓事件,其实就是一些callback方法,具体方法含义比较简单, 看文档即可,定义在DefaultHandler接口中(SAX已内置到JDK5.0中)
   
    待解析xml文件musics.xml:
   
    xml version=“1.0” encoding=“utf-8”?>
   
   
   
    黑色幽默name>
   
    JayalbumName>
   
    2000year>
   
    music>
   
   
   
    爱在西元前name>
   
    范特西albumName>
   
    2001year>
   
    music>
   
   
   
    回到过去name>
   
    八度空间albumName>
   
    2002year>
   
    music>
   
   
   
    东风破name>
   
    叶惠美albumName>
   
    2003year>
   
    music>
   
   
   
    七里香name>
   
    七里香albumName>
   
    2004year>
   
    music>
   
   
   
    一路向北name>
   
    十一月的萧邦albumName>
   
    2005year>
   
    music>musics>
   
    实体类MusicEntity就不贴了,四个属性,上面的xml中也可以看出。
   
    实现了DefaultHandler接口的SaxHandler:
   
    public class SaxHandler extends DefaultHandler{
   
    private static final String TAG = “lanyan”;
   
    private List musics;
   
    private MusicEntity music;
   
    //缓存上一次的标签名
   
    private String preTag;
   
    @Override
   
    public void startDocument() throws SAXException {
   
    musics = new ArrayList();
   
    }
   
    @Override
   
    public void startElement(String uri, String localName, String qName,
   
    Attributes attributes) throws SAXException {
   
    if (“music”.equals(localName)) {
   
    music = new MusicEntity();
   
    music.setId(Integer.parseInt(attributes.getValue(“id”)));
   
    }
   
    preTag = localName;
   
    }
   
    /**
   
    * 解析到文档中字符内容时调用
   
    * 所以一般网络中传输的xml,其父节点与子节点之间是紧挨在一起的,基本上就是一行,看起来很混乱,其实是为了避免解析时无必要的调用
   
    * 这里仅是测试,故忽略这个因素
   
    */
   
    @Override
   
    public void characters(char[] ch, int start, int length)
   
    throws SAXException {
   
    if (null != music) {
   
    String str = new String(ch, start, length);
   
    if (“name”.equals(preTag)) {
   
    music.setName(str);
   
    } else if (“albumName”.equals(preTag)) {
   
    music.setAlbumName(str);
   
    } else if (“year”.equals(preTag)) {
   
    music.setYear(Integer.parseInt(str));
   
    }
   
    }
   
    }
   
    @Override
   
    public void endElement(String uri, String localName, String qName)
   
    throws SAXException {
   
    if (“music”.equals(localName) && null != music) {
   
    musics.add(music);
   
    music = null;
   
    }
   
    preTag = null;
   
    }
   
    @Override
   
    public void endDocument() throws SAXException {
   
    }
   
    public List getMusics() {
   
    return musics;
   
    }
   
    }
   
    对外提供SAX解析服务的接口SaxService:
   
    public class SaxService {
   
    public static List readXml(InputStream is) throws Exception {
   
    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
   
    SAXParser parser = saxFactory.newSAXParser();//
   
    parser.setProperty(“http://xml.org/sax/features/namespaces”, true);
   
    SaxHandler handler = new SaxHandler();
   
    parser.parse(is, handler);
   
    return handler.getMusics();
   
    }
   
    }


[1] [2] 下一页

发表评论

昵称 * 验证码 * 验证码
上一篇: >使用java编写排序算法
下一篇: 常见JSP中文乱码例子及其解决方法

资质证书

增值电信业务许可证编号:滇B2-20110045
ISO9001:08915Q20090ROS
ISO27001:04817I20037R0S
奥远CMS:软著登字第0711164号
网站问题免费诊断

电子商务三位一体发展战略

技术研发

业务培训

实战运营

战略布局