一概述

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;    }}

更多相关文章

  1. Web设计中如何使用XML数据源对象详细介绍
  2. XmlSerializer 对象的Xml序列化和反序列化的示例代码分析
  3. XML中的树形结构与DOM文档对象模型的示例代码(图)
  4. XML中的标签与元素的使用具体介绍
  5. XmlDocument 对象操作详细步骤
  6. Microsoft的XMLHTTP对象详解
  7. XML学习(一)元素,属性,读取详解
  8. 详解在XML文档中替换元素名称的方法(图)
  9. XML开发基础-XML元素

随机推荐

  1. android的一些属性
  2. 【iOS-Android开发对比】之 数据存储
  3. Android中的横竖屏、资源、国际化的使用
  4. [置顶] Android开机铃声教程,所有Rom,不论C
  5. android新手入门FAQ
  6. Android(安卓)Studio和Gradle使用不同位
  7. android自学第二天 Android API Guide学
  8. delphi XE开发微信支付Android获取手机存
  9. android基础知识12:android自动化测试03—
  10. Android自定义视图二:如何绘制内容