0

0

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

黄舟

黄舟

发布时间:2017-03-08 16:22:17

|

1681人浏览过

|

来源于php中文网

原创

一概述

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解析

Bandy AI
Bandy AI

全球领先的电商设计Agent

下载

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));
                     }
                }
            }
            /*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 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;
    }

}

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

178

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

35

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

79

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

2

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

4

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

8

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

122

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

72

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
XML教程
XML教程

共142课时 | 5.9万人学习

XQuery 教程
XQuery 教程

共12课时 | 3.8万人学习

XLink  教程
XLink 教程

共7课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号