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