xml的生成和解析

概述:

在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,会导致崩溃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值