1 Overview
Xml, as a data interaction format, involves the generation and parsing of xml data. Here we will describe three methods of Xml parsing.
2. Dom parsing
1. Create a parser factory object (DocumentBuilderFactory object)
2. Create a parser object (DocumentBuilder)
3. Create a Document object
For example, parse the following file
<?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>
The parsing code is as follows
[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); } } }
3. Notes
1. Element ele = doc.getDocumentElement( ); Get the root element
2. When the element is obtained, the value of the element is also a node, and the value must be obtained by the element.getFirstChild().getNodeValue() method.
3. The blank spaces in xml are also of Node and text type.
4. SAX parsing
1. Create a SAXParserFactory object
2. Create a SAXparser object
3. Create a MyHandler that inherits the DefaultHandler class and overrides the method.
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 is based on the event model and is parsed sequentially. The internal implementation is The advantage of the observer mode is that it takes up less memory and is highly efficient. The disadvantage is that the encoding is relatively complicated.
5. Pull parsing
1. This parsing method does not come with JDK and needs to import a third-party library
2. Create an XmlPullParserFactory object
3 , Create an XmlPullParser object
4. Call xpp.setInput(is,”utf-8”)
5. Process the next event type of xpp.next() corresponding to the event type
[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; } }
The above is the detailed content of Sample code that details three methods of Xml data parsing. For more information, please follow other related articles on the PHP Chinese website!