溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何解析Xml數(shù)據(jù)

發(fā)布時間:2021-07-27 11:13:14 來源:億速云 閱讀:142 作者:小新 欄目:編程語言

小編給大家分享一下如何解析Xml數(shù)據(jù),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一概述

xml作為一種數(shù)據(jù)交互格式,涉及到xml數(shù)據(jù)的生成與解析,這里將講述Xml解析的三種方式。

二、Dom解析

1、創(chuàng)建解析器工廠對象(DocumentBuilderFactory對象)

2、創(chuàng)建解析器對象(DocumentBuilder)

3、創(chuàng)建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、構(gòu)建解析器對象
        DocumentBuilder   db = dbf.newDocumentBuilder();
        //3、構(gòu)建docment對象
        Document  doc = db.parse(new File("person.xml"));

        Element ele = doc.getDocumentElement();

        //實現(xiàn)解析邏輯
        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、獲取到元素時,元素的值也是節(jié)點,必須element.getFirstChild().getNodeValue()方法取值。

3、xml中的空白也是Node,text類型的。

四、SAX解析

1、創(chuàng)建SAXParserFactory對象

2、創(chuàng)建SAXparser對象

3、創(chuàng)建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("學(xué)生"))
            {
                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("學(xué)生"))
            {
                mList.add(student);
                student = null;
            }
    }

    @Override
    public void endDocument() throws SAXException {
         System.out.println("解析文檔結(jié)束了.....");
    }

}

SAX是基于事件模型的,順序解析的,內(nèi)部實現(xiàn)是觀察者模式,優(yōu)勢在于占用內(nèi)存少,效率高,缺點在編碼相對比較復(fù)雜。

五、Pull解析

1、此解析方式不是JDK自帶的,需要導(dǎo)入第三方庫

2、創(chuàng)建XmlPullParserFactory對象

3、創(chuàng)建XmlPullParser對象

4、調(diào)用xpp.setInput(is,”utf-8”)

5、對應(yīng)事件類型處理 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文件的方法 
   //參數(shù)說明
   //attrs是文件里bean對象的元素與屬性名
   //clazz是Bean對象的class對象
   //j代表屬性的個數(shù)
    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數(shù)據(jù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)
推薦閱讀:
  1. SQL解析XML
  2. 解析XML

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

xml
AI