栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > 其他 > xml语言

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

xml语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

一概述

xml作为一种数据交互格式,涉及到xml数据的生成与解析,这里将讲述Xml解析的三种方式。

二、Dom解析

1、创建解析器工厂对象(documentBuilderFactory对象)

2、创建解析器对象(documentBuilder)

3、创建document对象

例如解析下述文件

                     1             杨威             
大连
21
2 劉海洋
深圳
23
3 王小波
廣州
22

解析代码如下

[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 list = new ArrayList<>();        sp.parse(new File("student.xml"), new MyHandler(list));        System.out.println(list);    }}class MyHandler extends DefaultHandler {    private Stack stack = new Stack<>();    private Student student;    private List mList = null;    public MyHandler(List 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));                     }                }            }                        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 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 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  List getListBean(InputStream is, String[] attrs,            Class 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 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();                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数据解析的三种方式的示例代码的详细内容,更多请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/794683.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号