一、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原文件】

Tom_zhang1

19

18677435526

1

Technical department

Susy_wang

18

18962459987

2

Financial department

Jack_Ma

45

1867755334

3

Financial department

【代码】

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 parser(String fileName) {

List staffs = new ArrayList(); //创建一个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 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 dom解析xml路径中文_Java如何基于DOM解析xml文件相关推荐

  1. java读取xml路径问题_java 中读取xml 和绝对路径

    一.得到绝对路径 本人用到的不多,就列举常用的. 以上2种可读取固定配置文件可用得到绝对路径 1.System.getProperty("user.dir"); 这个东西局限性十分 ...

  2. JAVA一个项目的路径为_java 得到项目路径

    一 相对路径的获得 说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目) String relativelyPath=System.getProper ...

  3. xml 数字签名 破解_JAVA中带有数字签名的XML安全性

    xml 数字签名 破解 介绍 如您所知,XML在我们的产品或项目开发中起着重要作用,并且从XML文档中我们收集了很多信息,并且我们可以对XML文件执行CRUD操作. 但是,关于如何确保XML文件中可用 ...

  4. java递归删除空文件夹_Java 删除空文件夹和文件夹及其下面的文件

    一.删除代码: package deletedir; import java.io.File; public class DeleteDir { //删除空目录 public void doDelet ...

  5. java jdom 设置第1行_Java通过jdom操作生成XML文件的实例代码下载

    工作需要,要生成xml文件,所以做了个小demo分享一下. 看代码吧~ main()里面没什么好说的 该写的都写了public static void main(String[] args) { // ...

  6. java生成pdf不支持中文_java生成pdf以及解决中文中文乱码问题

    [在网上搜了一下iText的东东,简单的整理了一个Demo,解决了中文乱码问题,这里不贴链接了 网上搜一下就行了package com.westdream.test;import java.io.Fi ...

  7. java获取默认下载路径吗_java下载文件到浏览器默认路径

    java下载文件到浏览器默认路径 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog..net/mengmeng2222222 一.controller层代码: @Requ ...

  8. java的编译和连接方法_Java:编译时解析和“最具体的方法”

    如果您尝试在下面使用它们,重载函数compute1(),compute2()和compute5()会导致编译错误: package com.example.test.reflect; class JL ...

  9. 怎么向java窗口中插入XSL表_Java向word中插入Excel文件对象

    前言: 在word文件中,虽然也有表格.但是有时我们想要将Excel中表格的大量数据直接插入到word文档中,这就需要用到word的插入对象的功能,也就是直接将Excel文件当做对象插入到word中. ...

最新文章

  1. C#调用Oracle存储过程分页
  2. CENTOS7.2使用RDO方式安装OpenStack Mitaka笔记
  3. 基于python的天气预报系统,基于python编写的天气抓取程序
  4. 微信支付 php编程,PHP编程:微信支付开发交易通知实例
  5. 第一次更名为OpenInfra的“她”,给我们带来了哪些惊喜?| 技术头条
  6. 【华为云专家技术公开课】7月4日直播,报名观看赢取好礼
  7. 想来字节跳动和我做同事吗?抓紧这次机会吧~
  8. 使用jQuery来创建平滑的页面滚动
  9. 数字逻辑练习题(七) 用74LS138译码器和门电路实现逻辑函数
  10. VirtualBox安装黑苹果
  11. python采集微信聊天信息_我用 Python 破解了微信聊天记录,自动同步微信文章
  12. 过去式和现在完成时区别
  13. 密苏里大学理工学院计算机,美国密苏里大学工学院计算机系主任Dong Xu教授访问我校...
  14. 微信小程序base64转为二维码、条形码图片
  15. C语言入门实战(11):输入一组正整数,求逆序数的和
  16. java开发融云web聊天
  17. STM32开发笔记108:将STM32CubeIDE设置为中文
  18. 高斯消元法求解线性方程组(附python代码)
  19. web和httpd协议
  20. 第十五周作业——ZJM与生日礼物

热门文章

  1. WRF学习笔记之四:撰写WPS intermediate file添加海冰场/NCL学习/WRF进阶:如何向WRF添加额外气象场?
  2. 在服务器开启pathinfo
  3. 二次开发发票管理软件应该注意的事项
  4. 基于JAVA租车网站计算机毕业设计源码+系统+lw文档+部署
  5. 学python兼职赚钱是真的吗,学python做兼职赚钱吗....
  6. 字节跳动一站式数据治理解决方案及平台架构
  7. MATLAB实现利用图像深度信息合成不同浓度的雾【Cityscapes_foggy数据集】
  8. 如何设置git和git gui的界面语言为中文
  9. python编码规范
  10. sublime text 3+minGW 编译中的问题汇总及解决方案