xml的生成和解析

来源:互联网 发布:淘宝app能修改差评吗 编辑:程序博客网 时间:2024/06/05 22:41

概述:

在xml解析中存在三种解析sax解析,dom解析,pull解析。sax解析与pull解析比较类似,都是基于事件驱动,逐行读取解析,特点是解析速度快,占用内存小,解析完之后就被回收了。dom解析是一次性加载整个xml数据形成dom树,可以对整个xml的数据进行增删改查的操作,特点是比较耗内存,解析的速度比较慢。相比于文档对象模型DOM,pull是读取和操作 XML 数据的更快速、更轻量的方。由于android的内存有限,pull解析采用的就更广泛。在这里介绍下两种XML的解析方式,一种是一种是pull解析,dom4j解析如下代码里面会有详细介绍这两种解析的详细情况。

一.pull解析

1、xml文件的生成

private void createXML() {try {// 创建解析工厂XmlPullParserFactory factory = XmlPullParserFactory.newInstance();// 获取解析器XmlSerializer xmlSerializer = factory.newSerializer();// 获取输出流ByteArrayOutputStream bos = new ByteArrayOutputStream();// 设置输出流xmlSerializer.setOutput(bos, "utf-8");// 开始文件xmlSerializer.startDocument("utf-8", true);// 设置开始标签、文本、结束标签,成对出现xmlSerializer.startTag(null, "request");xmlSerializer.startTag(null, "fwdm");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "fwdm");xmlSerializer.startTag(null, "khlist");xmlSerializer.startTag(null, "khxx");xmlSerializer.startTag(null, "khlxid");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "khlxid");xmlSerializer.startTag(null, "khmc");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "khmc");xmlSerializer.startTag(null, "nsrsbh");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "nsrsbh");xmlSerializer.startTag(null, "dz");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "dz");xmlSerializer.startTag(null, "dh");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "dh");xmlSerializer.startTag(null, "khh");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "khh");xmlSerializer.startTag(null, "zh");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "zh");xmlSerializer.startTag(null, "zjlx");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "zjlx");xmlSerializer.startTag(null, "zjhm");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "zjhm");xmlSerializer.startTag(null, "yx");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "yx");xmlSerializer.startTag(null, "lxr");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "lxr");xmlSerializer.startTag(null, "lxrsj");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "lxrsj");xmlSerializer.startTag(null, "xh");xmlSerializer.text("ddd");xmlSerializer.endTag(null, "xh");xmlSerializer.endTag(null, "khxx");xmlSerializer.endTag(null, "khlist");xmlSerializer.endTag(null, "request");// 文件的结束xmlSerializer.endDocument();String s = bos.toString();Toast.makeText(this, s, 1).show();} catch (Exception e) {e.printStackTrace();}}

生成的文件如下:

<?xml version="1.0" encoding="utf-8"?><request>  <fwdm>ddd</fwdm>  <khlist>    <khxx>      <khlxid>ddd</khlxid>      <khmc>ddd</khmc>      <nsrsbh>ddd</nsrsbh>      <dz>ddd</dz>      <dh>ddd</dh>      <khh>ddd</khh>      <zh>ddd</zh>      <zjlx>ddd</zjlx>      <zjhm>ddd</zjhm>      <yx>ddd</yx>      <lxr>ddd</lxr>      <lxrsj>ddd</lxrsj>      <xh>ddd</xh>    </khxx>  </khlist></request>

2、xml文件的解析

解析:

<?xml version="1.0" encoding="utf-8"?><result>   <data>呵呵呵</data>    <rtncode>0000</rtncode>    <rtnmsg>返回信息</rtnmsg> </result>

public void analyXml(String xml) throws Exception {XmlPullParserFactory factory = XmlPullParserFactory.newInstance();        XmlPullParser parser = factory.newPullParser();        ByteArrayInputStream inputStream = new ByteArrayInputStream(xml.getBytes());        parser.setInput(inputStream, "utf-8");        int type = parser.getEventType();        //判断是否是结束文件        while (type != XmlPullParser.END_DOCUMENT) {            String name = parser.getName();            switch (type) {            //开始标签                case XmlPullParser.START_TAG:                    if ("data".equals(name)) {                       String nextText = parser.nextText();                    } else if ("rtncode".equals(name)) {                        String nextText = parser.nextText();                    } else if ("rtnmsg".equals(name)) {                        String nextText = parser.nextText();                    }                    break;                                       //结束标签                case XmlPullParser.END_TAG:                    break;                default:                    break;            }            //向下走一步            parser.next();            //再次获取事件类型            type = parser.getEventType();        }}

二.dom4j解析

1、xml文件生成

public void createXml() {//导入dom4j的jar包        //创建文件        Document document = DocumentHelper.createDocument();        //设置编码方式        document.setXMLEncoding("UTF-8");        //设置根节点        Element element = document.addElement("request");        //设置子节点并且设置文本        element.addElement("kpzdbs").addText("11111");        element.addElement("fplxdm").addText("11111");        element.addElement("sblx").addText("0");        Element element1 = element.addElement("skpkl");        element1.addElement("skpkl").addText("11111");        element1.addElement("keypwd").addText("11111");        element1.addElement("qmcs").addText("11111");        String xml = element.asXML();}
生成的文件如下:

<?xml version="1.0" encoding="utf-8"?><request>  <kpzdbs>11111</kpzdbs>  <fplxdm>11111</fplxdm>  <sblx>0</sblx>  <skpkl>    <skpkl>11111</skpkl>    <keypwd>11111</keypwd>    <qmcs>11111</qmcs>  </skpkl></request>
2、xml文件解析

解析如下的xml:

<?xml version="1.0" encoding="utf-8"?><request>   <kpzdbs>11111</kpzdbs>    <fplxdm>11111</fplxdm>    <sblx>0</sblx>    <skpkl>     <list1>       <skpkl>11111</skpkl>        <keypwd>11111</keypwd>        <qmcs>11111</qmcs>     </list1>   </skpkl> </request>

    public void parseXml(String xml) throws DocumentException {        try {            Document document = DocumentHelper.parseText(xml);            Element rootElement = document.getRootElement();            String kpzdbs = rootElement.elementTextTrim("kpzdbs");            String fplxdm = rootElement.elementTextTrim("fplxdm");            String sblx = rootElement.elementTextTrim("sblx");                        Element skpkl1 = rootElement.element("skpkl");            // List elements = skpkl1.elements("list1");  //获取list1节点所有的集合            Iterator iterator = skpkl1.elementIterator("list1");            while (iterator.hasNext()) {                Element element = (Element) iterator.next();                //List elements = element.elements();  //获取list1节点所有的集合                String skpkl = element.elementTextTrim("skpkl");                String keypwd = element.elementTextTrim("keypwd");                String qmcs = element.elementTextTrim("qmcs");            }        } catch (DocumentException e) {            e.printStackTrace();        }    }


注意:以上两种方式在生成xml的时候,标签里文本不能为null,这个在写javabean时候要注意做非空判断,否则无法生成xml,会导致崩溃。

0 0
原创粉丝点击