Java如何基于DOM解析xml文件_java

来源:脚本之家  责任编辑:小易  

纯dom和sax解析都是2113用工厂模式用纯dom解析这样创建5261xml对象Document doucment = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);file是xml文件路径然后用getElementByTagName获取节点4102,开始解析另外,这样用hashmap感觉很别扭你确定1653要这样存?追问关键是我在用的时候并不知道节点名字,相当于是公用的。不能用getElementByTagName。 如果不存在hashmap中,那要怎么存呢?存在list中吗? 谢谢解答,你自己搜索下 dom4j 这个api的使用, 非常之简单!!!!www.zgxue.com防采集请勿采集本网。

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

import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element;

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

public static void main(String[] args) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.new

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

db = dbf.newDocumentBuilder(); Document doc = db.parse("1.xml"); NodeList l = doc.getElementsByTagName("数据组").item(0).getChildNodes

二、【DOM 简单使用介绍】

在java环境下读取xml文件的方法主要有4种:DOM、SAX、JDOM、JAXB 1. DOM(Document Object Model) 此方法主要由W3C提供,它将xml文件全部读入内存中,然后

1、【DOM(Document Object Model) 】

什么意思?你是解析xml还是放入xml中

由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=男]

建一个Student实体类封2113装数据,我给的是我以前解5261析的一个跟你的xml结构很像的例子,你4102只要简单的改动下就1653可以了。public static List<Student> readXml() { List<Student> list = new ArrayList<Student>(); //定义一个dom解析器工厂实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { //由工厂实例得到一个dom解析器 DocumentBuilder dom = factory.newDocumentBuilder(); //找到xml文档 File file=new File("src/com/jereh/ch05/Students.xml"); Document doc=dom.parse(file); // Element root = doc.getDocumentElement(); NodeList stuNodeList = root.getChildNodes(); for (int i = 0; i < stuNodeList.getLength(); i++) { Node stu = stuNodeList.item(i); Student student = new Student(); if (stu != null && stu.getNodeType() == Node.ELEMENT_NODE) { // System.out.println(stu); Element stuElement = (Element) stu; student.setNo(stuElement.getAttribute("id")); // stu.getAttributes().getNamedItem(null); // Element stu=(Element)stuNodeList NodeList info = stuElement.getChildNodes(); for (int j = 0; j < info.getLength(); j++) { info.item(j).getNodeName(); Node n = info.item(j); if ("name".equals(n.getNodeName())) { // n.getFirstChild().getNodeValue(); student.setName(n.getLastChild().getNodeValue()); } else if ("age".equals(n.getNodeName())) { student.setAge(Integer.parseInt(n.getFirstChild() .getNodeValue())); } list.add(student); } } } } 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(); } // System.out.println(root.getNodeValue()); return list; },public static void main(String[] args) { try { // 创建解析器工厂 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 获得2113解析器 DocumentBuilder db = dbf.newDocumentBuilder(); // 对XMl文档进行解5261析,得到4102Document Document doc = db.parse("c:/1.xml"); // 得到所有《brand》列表信息1653 NodeList stuList = doc.getElementsByTagName("Student"); // 循环Student信息 if(stuList !=null && stuList.getLength()>0){ for (int i = 0; i < stuList.getLength(); i++) { Node student = stuList.item(i); NodeList infoList = student.getChildNodes(); for (int j = 0; j < infoList.getLength(); j++) { Node typeElement = (Node) infoList.item(j); if(typeElement instanceof Element) { Element element = (Element) typeElement; Text content = (Text)element.getFirstChild(); System.out.println(element.getNodeName()+":"+content.getData()); } } } } } catch (Exception e) { e.printStackTrace(); } },使用dom4j,很简单的,导入一楼的dom4j的包,使用二楼的方法,就可以了,使用dom4j内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • java方法重载示例
  • spring mvc+fastjson+hibernate-validator整合的完整实例教程
  • java判断对象是否为空(包括null ,"")的方法
  • java从字符串中提取数字的简单实例
  • java全局异常处理器实现过程解析
  • java如何获取指定目录文件列表
  • java8新特性之深入解析日期和时间_动力节点java学院整理
  • 详解java基础篇--面向对象1(构造方法,static、this关键字)
  • spring对jdbc和orm的支持实例详解
  • 使用spring data jdbc实现ddd聚合的示例代码
  • 如何用java程序通过DOM方式解析xml文件?
  • java解析xml。如何用dom方式解析xml并将数据放入ha...
  • 编写一个Java程序,使用DOM解析器解析下列XML文件
  • 怎么在java中使用dom解析XML文件中标签属性值? 有...
  • java dom解析xml(根据条件)
  • Java Dom解析XML
  • java dom 解析xml
  • 在java在如何解析XML文件
  • java dom 如何解析res文件夹下的xml?
  • 怎么通过JAva解析的方法把一个xml文件分成两个XML ...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言其它相关首页java使用dom4j对xml文件进行增删改查操作java使用dom4j实现读写xml文件的属性和元素java中使用dom4j解析xml文件的方法教程java中使用dom和sax解析xml文件的方法示例java使用jdom实现xml文件写入操作实例java使用dom4j解析xml配置文件实现抽象工厂反射示例java dom4j解析xml文件代码实例分享java 使用jdom解析xml文件java方法重载示例spring mvc+fastjson+hibernate-validator整合的完整实例教程java判断对象是否为空(包括null ,"")的方法java从字符串中提取数字的简单实例java全局异常处理器实现过程解析java如何获取指定目录文件列表java8新特性之深入解析日期和时间_动力节点java学院整理详解java基础篇--面向对象1(构造方法,static、this关键字)spring对jdbc和orm的支持实例详解使用spring data jdbc实现ddd聚合的示例代码java使double保留两位小数的多方java8 十大新特性详解intellij idea 2020最新激活码(亲java.net.socketexception: connjava写入文件的几种方法分享java环境变量的设置方法(图文教程java 十六进制与字符串的转换java list用法示例详解java中file类的使用方法javaweb实现文件上传下载功能实例java存储以及java对象创建的流程(详解)springcloud zuul过滤器实现登陆鉴权代码java中断线程的方法java四种访问权限实例分析mybatis-plus id主键生成的坑java关系操作符简写介绍java线程中的notifyall唤醒操作(推荐)java完全二叉树的创建与四种遍历方法分析java创建对象的几种方法java swing实现的扫雷游戏及改进版完整示
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved