您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

详细介绍Xml数据解析的三种方式的示例代码

2024/3/12 18:12:48发布29次查看
一概述
xml作为一种数据交互格式,涉及到xml数据的生成与解析,这里将讲述xml解析的三种方式。
二、dom解析
1、创建解析器工厂对象(documentbuilderfactory对象)
2、创建解析器对象(documentbuilder)
3、创建document对象
例如解析下述文件
<?xml version="1.0" encoding="utf-8"?> <students> <student id = "1001"> <id>1</id> <name>杨威</name> <address>大连</address> <age>21</age> </student> <student id = "1002"> <id>2</id> <name>劉海洋</name> <address>深圳</address> <age>23</age> </student> <student id = "1003"> <id>3</id> <name>王小波</name> <address>廣州</address> <age>22</age> </student> </students>
解析代码如下
[code]package com.kuxiao.train.xml; import java.io.file; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import org.w3c.dom.document; import org.w3c.dom.element; import org.w3c.dom.nodelist; public class xmlparsetest { public static void main(string[] args) throws exception { //xml doc解析步骤 //1、获取解析工厂对象 documentbuilderfactory dbf = documentbuilderfactory.newinstance(); //2、构建解析器对象 documentbuilder db = dbf.newdocumentbuilder(); //3、构建docment对象 document doc = db.parse(new file("person.xml")); element ele = doc.getdocumentelement(); //实现解析逻辑 nodelist list = doc.getelementsbytagname("student"); for(int i = 0; i < list.getlength();i++) { element element = (element) list.item(i); string attrid = element.getattribute("id"); system.out.println("attrid = " + attrid); element element1 = (element) element.getelementsbytagname("id").item(0); string id = element1.getfirstchild().getnodevalue(); system.out.println(id); element1 = (element) element.getelementsbytagname("name").item(0); string name = element1.getfirstchild().getnodevalue(); system.out.println(name); element1 = (element) element.getelementsbytagname("address").item(0); string address = element1.getfirstchild().getnodevalue(); system.out.println(address); } } }
三、注意事项
1、element ele = doc.getdocumentelement(); 获取根元素
2、获取到元素时,元素的值也是节点,必须element.getfirstchild().getnodevalue()方法取值。
3、xml中的空白也是node,text类型的。
四、sax解析
1、创建saxparserfactory对象
2、创建saxparser对象
3、创建myhandler继承defaulthandler类,重写方法。
4、sp.parse(new file(“student.xml”), new myhandler(list));
[code]package com.kuxiao.train.xml.sax; import java.io.file; import java.util.arraylist; import java.util.list; import java.util.stack; import javax.xml.parsers.saxparser; import javax.xml.parsers.saxparserfactory; import org.xml.sax.attributes; import org.xml.sax.saxexception; import org.xml.sax.helpers.defaulthandler; public class testsax { public static void main(string[] args) throws exception { saxparserfactory spf = saxparserfactory.newinstance(); saxparser sp = spf.newsaxparser(); list<student> list = new arraylist<>(); sp.parse(new file("student.xml"), new myhandler(list)); system.out.println(list); } } class myhandler extends defaulthandler { private stack<string> stack = new stack<>(); private student student; private list<student> mlist = null; public myhandler(list<student> list) { this.mlist = list; } @override public void startdocument() throws saxexception { system.out.println("解析文档开始了..."); } @override public void startelement(string uri, string localname, string qname, attributes attributes) throws saxexception { if(qname.equals("学生")) { student = new student(); if(attributes.getlength() != 0) { for(int i = 0; i < attributes.getlength();i++) { string id = attributes.getvalue(i); student.setid(integer.parseint(id)); } } } /*if(qname.equals("姓名")) { stack.push(qname); } if(qname.equals("年龄")) { stack.push(qname); } if(qname.equals("性别")) { stack.push(qname); }*/ stack.push(qname); } @override public void characters(char[] ch, int start, int length) throws saxexception { string qname = stack.peek(); if(qname.equals("性别")){ student.setgender(new string(ch,start,length)); } if(qname.equals("姓名")){ student.setname(new string(ch,start,length)); } if(qname.equals("年龄")){ student.setage(new string(ch,start,length)); } } @override public void endelement(string uri, string localname, string qname) throws saxexception { stack.pop(); if(qname.equals("学生")) { mlist.add(student); student = null; } } @override public void enddocument() throws saxexception { system.out.println("解析文档结束了....."); } }
sax是基于事件模型的,顺序解析的,内部实现是观察者模式,优势在于占用内存少,效率高,缺点在编码相对比较复杂。
五、pull解析
1、此解析方式不是jdk自带的,需要导入第三方库
2、创建xmlpullparserfactory对象
3、创建xmlpullparser对象
4、调用xpp.setinput(is,”utf-8”)
5、对应事件类型处理 xpp.next()下一个事件类型
[code]package com.kuxiao.train.xml.pull; import java.io.file; import java.io.fileinputstream; import java.io.inputstream; import java.lang.reflect.method; import java.util.arraylist; import java.util.list; import org.xmlpull.v1.xmlpullparser; import org.xmlpull.v1.xmlpullparserfactory; public class pulltest { public static void main(string[] args) throws exception { fileinputstream is = new fileinputstream(new file("person.xml")); long time = system.currenttimemillis(); list<student> list = new arraylist<>(); xmlpullparserfactory xppf = xmlpullparserfactory.newinstance(); xmlpullparser xpp = xppf.newpullparser(); xpp.setinput(is, "utf-8"); student student = null; int eventtype = xpp.geteventtype(); while (eventtype != xmlpullparser.end_document) { switch (eventtype) { case xmlpullparser.start_tag: if (xpp.getname().equals("student")) { student = new student(); string id = xpp.getattributevalue(0); student.setid(id); } else if (xpp.getname().equals("name")) { student.setname(xpp.nexttext()); } else if (xpp.getname().equals("address")) { student.setaddress(xpp.nexttext()); } else if (xpp.getname().equals("age")) { student.setage(xpp.nexttext()); } break; case xmlpullparser.start_document: system.out.println("开始了...."); break; case xmlpullparser.end_tag: if (xpp.getname().equals("student")) { list.add(student); student = null; } break; } eventtype = xpp.next(); } is.close(); long time1 = system.currenttimemillis(); system.out.println(time1 - time); for (student student2 : list) { system.out.println(student2); } fileinputstream fis = new fileinputstream(new file("person.xml")); list<student> list1 = getlistbean(fis, new string[] { "id", "name", "address", "age", "gender" }, student.class, 0); for (student student2 : list1) { system.out.println(student2); } } //封装的全能解析xml文件的方法 //参数说明 //attrs是文件里bean对象的元素与属性名 //clazz是bean对象的class对象 //j代表属性的个数 public static <t> list<t> getlistbean(inputstream is, string[] attrs, class<t> clazz, int j) throws exception { long time = system.currenttimemillis(); t c = null; xmlpullparserfactory xppf = xmlpullparserfactory.newinstance(); xmlpullparser xpp = xppf.newpullparser(); xpp.setinput(is, "utf-8"); list<t> list = null; int eventtype = xpp.geteventtype(); string classname = ""; while (eventtype != xmlpullparser.end_document) { switch (eventtype) { case xmlpullparser.start_tag: int bigen = clazz.getname().lastindexof(".") + 1; classname = clazz.getname().substring(bigen); classname = classname.substring(0, 1).tolowercase() + classname.substring(1); string elementname = xpp.getname(); if (classname.equals(elementname)) { c = clazz.newinstance(); if (xpp.getattributecount() != 0) { for (int i = 0; i < j; i++) { string attrname = xpp.getattributename(i); for (string field : attrs) { if (field.equals(attrname)) { string frist = field.substring(0, 1) .touppercase(); method method = clazz.getdeclaredmethod( "set" + frist + field.substring(1), new class[] { string.class }); method.setaccessible(true); method.invoke(c, xpp.getattributevalue(i)); } } } } } else { for (string field : attrs) { if (field.equals(elementname)) { string frist = field.substring(0, 1).touppercase(); method method = clazz.getdeclaredmethod("set" + frist + field.substring(1), new class[] { string.class }); method.setaccessible(true); method.invoke(c, xpp.nexttext()); } } } break; case xmlpullparser.start_document: list = new arraylist<t>(); break; case xmlpullparser.end_tag: if (!classname.equals("") && classname.equals(xpp.getname())) { list.add(c); c = null; } break; } eventtype = xpp.next(); } is.close(); long time1 = system.currenttimemillis(); system.out.println(time1 - time); return list; } }
以上就是详细介绍xml数据解析的三种方式的示例代码的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product