一概述
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数据解析的三种方式的示例代码的详细内容。更多信息请关注PHP中文网其他相关文章!