Java如何基于DOM解析xml文件

 更新时间:2020年09月16日 12:02:59   作者:秋天中的一片叶  
这篇文章主要介绍了Java如何基于DOM解析xml文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、Java解析xml、解析xml四种方法、DOM、SAX、JDOM、DOM4j、XPath

此文针对其中的DOM方法具体展开介绍及代码分析

sax、dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的;jaxp只是api,它进一步封装了sax、dom两种接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默认使用xerces解释器)。如果是嵌入式的情况下建议使用sax方法进行解析,因为它不需要一下子把数据都保存到内存中然后再解析是可以逐步解析的。而DOM不行,必须一次性把数据存到内存中,然后一并解析。这样做虽然速度会很快,但是同时也加大了对内存的消耗。如果文件很大的情况下不建议DOM解析。

二、【DOM 简单使用介绍】

1、【DOM(Document Object Model) 】

由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。

下面一段是DOM解析xml的一个案例一起来看一下。

【xml原文件】

<?xml version = "1.0" encoding = "UTF-8"?>
<staffs>
  <staff id="1">
    <name>Tom_zhang1</name>
    <age>19</age>
    <sex>男</sex>
    <phone>18677435526</phone>
    <group>
      <id>1</id>
      <name>Technical department</name>
    </group>
  </staff>
  <staff id="2">
    <name>Susy_wang</name>
    <age>18</age>
    <sex>女</sex>
    <phone>18962459987</phone>
    <group>
      <id>2</id>
      <name>Financial department</name>
    </group>
  </staff>
 
  <staff id="3">
    <name>Jack_Ma</name>
    <age>45</age>
    <sex>男</sex>
    <phone>1867755334</phone>
    <group>
      <id>3</id>
      <name>Financial department</name>
    </group>
  </staff>
</staffs>

【代码】

Staff 类

package Entity;

public class Staff {
  
  private int id;
  private String name;
  private int age;
  private String sex;
  private String phone;
  private StuGroup group;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  public String getPhone() {
    return phone;
  }
  public void setPhone(String phone) {
    this.phone = phone;
  }
  public StuGroup getGroup() {
    return group;
  }
  public void setGroup(StuGroup group) {
    this.group = group;
  }
  public Staff() {
    super();
    // TODO Auto-generated constructor stub
  }
  public Staff(int id, String name, int age, String sex, String phone,
      StuGroup group) {
    super();
    this.id = id;
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.phone = phone;
    this.group = group;
  }
  @Override
  public String toString() {
    return "Staff [age=" + age + ", group=" + group + ", id=" + id
        + ", name=" + name + ", phone=" + phone + ", sex=" + sex + "]";
  }
}

Group 类

package Entity;

public class Group {
  
  private int id;
  private String name;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Group() {
    super();
    // TODO Auto-generated constructor stub
  }
  public Group(int id, String name) {
    super();
    this.id = id;
    this.name = name;
  }
  @Override
  public String toString() {
    return "Group [id=" + id + ", name=" + name + "]";
  } 
}

注释: Staff类不需解释,xml文件中有几个<>就需要创建几个字段。Group类的创建是因为group本身又是一个节点,它有它自己的字段。因此在这边把这种情况单独作为一个类创建,同时也方便日后维护管理。依次类推如果有更多的子类,方法一样创建相应的类即可。

无论是DOM解析还是SAX解析,都是通过一个叫做Parser的解释器,来对xml文件进行解析。而这个解析器是需要我们手动创建的,接下来就一起来看一下解释器中的代码,也是最主要的代码。

Dom_parser(解析器)

package Parser;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import Entity.StuGroup;
import Entity.Staff;

public class Dom_parser {

  public static List<Staff> parser(String fileName) {

    List<Staff> staffs = new ArrayList<Staff>(); //创建一个ArrayList来装数据

    DocumentBuilderFactory factory = null;  //DocumentBuilderFactory,DocumentBuilder,Document分别是DOM解析的工厂类
    DocumentBuilder builder = null;
    Document doc = null;
    Staff staff = null;           //方便日后实例化
    StuGroup group = null;         //同上

    try {
      factory = DocumentBuilderFactory.newInstance();  //工厂类实例化
      builder = factory.newDocumentBuilder();      //工厂类实例化
      doc = builder.parse(new File(fileName));     //通过.parser方法加载文件

      Element root = doc.getDocumentElement();     //Element方法中的.getDocumentElement()代表获取xml文件的头文件内容

      NodeList nodelist = root.getElementsByTagName("staff"); //获取TagName,每一个<>中的字段为一个TagName.作为一个nodelist来保存
            //循环这个NodeList,然后得到每个nodelist中的item。根据获取到的值的索引最终通过.set方法得到这个值
      for (int index = 0; index < nodelist.getLength(); index++) {
        staff = new Staff();
        Node node = nodelist.item(index);
        staff.setId(Integer.parseInt(node.getAttributes().getNamedItem(
            "id").getTextContent()));
        // System.out.println(staff);

        NodeList childNode = node.getChildNodes();  //设置一个childNode为了存放nodelist下子<>中的TagName
                  //同上循环子childNode这个list,获取到每个元素的下标。再通过.set方法分别得到每个元素的值。
        for (int i = 0; i < childNode.getLength(); i++) {
          Node childitem = childNode.item(i);
          if (childitem.getNodeName().equals("name")) {
            staff.setName(childitem.getTextContent());
          } else if (childitem.getNodeName().equals("age")) {
            staff.setAge(Integer.parseInt(childitem
                .getTextContent()));
          } else if (childitem.getNodeName().equals("sex")) {
            staff.setSex(childitem.getTextContent());
          } else if (childitem.getNodeName().equals("phone")) {
            staff.setPhone(childitem.getTextContent());
          } else if (childitem.getNodeName().equals("group")) {
            NodeList groupnode = childitem.getChildNodes();

            for (int j = 0; j < groupnode.getLength(); j++) {
              Node groupitem = groupnode.item(j);
                            
              if (groupitem.getNodeName().equals("id")) {
                group = new StuGroup(); //这里的实例化很重要,切记不要实例化错误地方
                String groupId = groupitem.getTextContent();
                group.setId(Integer.parseInt(groupId));
                staff.setGroup(group);
              } else if (groupitem.getNodeName().equals("name")) {
                String groupName = groupitem.getTextContent();
                group.setName(groupName);
                staff.setGroup(group);
              }
            }

          }

        }
        staffs.add(staff); //最终我们要把staff这个对象追加到staffs这个集合中。
      }

    } catch (ParserConfigurationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SAXException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return staffs; //返回这个集合
  }
}

【测试类】

package Parser;
 
import java.util.List;
 
import Entity.Staff;
 
public class Test {
   
  public static void main(String[] args) {
     
    String file = "C:/Users/IBM_ADMIN/Desktop/xml/staff.xml";  //指定文件地址
    List<Staff> staffs = Dom_parser.parser(file);  //因为我们创建的解析器的名字叫Dom_parser所以在这里调用Dom_parser.parser()方法。()中参数为文件地址。        //循环并打印结果
    for(Staff list:staffs){
      System.out.println(list);
    }
  }
}

【打印结果】

打印结果如下。可以看到xml中每个TageName以及对应的值,通过DOM解析的方式把结果都一一的被获取并打印出来了。

目前我们是把数据放到了ArrayList内存中。后续可以把数据存放到数据库中。

Staff [age=19, group=Group [id=1, name=Technical department], id=1, name=Tom_zhang1, phone=18677435526, sex=男]
Staff [age=18, group=Group [id=2, name=Financial department], id=2, name=Susy_wang, phone=18962459987, sex=女]
Staff [age=45, group=Group [id=3, name=Financial department], id=3, name=Jack_Ma, phone=1867755334, sex=男]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java中lambda表达式语法说明

    java中lambda表达式语法说明

    “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
    2016-09-09
  • Java Netty实现心跳机制过程解析

    Java Netty实现心跳机制过程解析

    这篇文章主要介绍了Java Netty实现心跳机制过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java如何获取当前进程ID以及所有Java进程的进程ID

    Java如何获取当前进程ID以及所有Java进程的进程ID

    本篇文章主要介绍了Java如何获取当前进程ID以及所有Java进程的进程ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Spring Boot中使用MongoDB的连接池配置的方法

    Spring Boot中使用MongoDB的连接池配置的方法

    本文介绍了Spring Boot中使用MongoDB的连接池配置的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • java基于servlet实现文件上传功能解析

    java基于servlet实现文件上传功能解析

    这篇文章主要为大家详细介绍了java基于servlet实现上传功能,后台使用java实现,前端主要是js的ajax实现,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 简单工厂模式_动力节点Java学院整理

    简单工厂模式_动力节点Java学院整理

    这篇文章主要介绍了简单工厂模式的相关资料,和大家一起学习静态工厂方法模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • SpringBoot拦截器如何获取http请求参数

    SpringBoot拦截器如何获取http请求参数

    这篇文章主要给大家介绍了SpringBoot拦截器如何获取http请求参数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解java.lang.reflect.Modifier.isInterface()方法

    详解java.lang.reflect.Modifier.isInterface()方法

    这篇文章主要介绍了详解java.lang.reflect.Modifier.isInterface()方法的相关资料,这里提供实例帮助大家理解这个方法的使用,需要的朋友可以参考下
    2017-09-09
  • js-tab选项卡

    js-tab选项卡

    本文主要介绍了js-tab选项卡的示例代码。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 你应该知道的这些Mybatis-Plus使用技巧(小结)

    你应该知道的这些Mybatis-Plus使用技巧(小结)

    这篇文章主要介绍了你应该知道的这些Mybatis-Plus使用技巧(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论