Java对XML文件的解析

  • 一、前言
  • 二、实例分析 - DOM方式解析XML文件
    • 2.1 XMLDomParseUtil - 抽象工具类
    • 2.2 待解析xml文件示例
    • 2.3 解析xml文件
      • 2.3.1 新建一个用于存储xml文件中各节点的属性和属性值的类
      • 2.3.2 解析实际节点
    • 2.4 测试

一、前言

1、HTTP网络传输中的数据组织方式有三种方式:
   (1)HTML方式
   (2)XML方式
   (3)JSON方式
  今天主要讲解的是对XML文件的解析。
2、对XML文件的介绍:
  xml为可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。它的文件结构中包括了节点、元素、属性和属性值,其语法规则为:
   (1)开始和结束标签匹配
   (2)嵌套标签不能互相嵌套
   (3) 区分大小写。
3、解析XML数据的方式:
  (1)DOM(org.w3c.dom):
   “文档对象模型”方式,解析完的Xml将生成一个树状结构的对象。
  (2)SAX(org.xml.sax):
   以事件的形式通知程序,对Xml进行解析。
  (3)XMLPULL(org.xmlpull.v1):
   程序以“拉取”的方式对Xml进行解析。

二、实例分析 - DOM方式解析XML文件

  使用java编写以DOM方式解析某目录下的特定XML文件。

2.1 XMLDomParseUtil - 抽象工具类

  定义一个Xml文件的解析工具,工具只负责取出数据,并提供一个操作数据的抽象方法。方便以后打成jar包,用的时候导包就行。

package xml.util;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/*** 使用Dom方式解析xml文件的工具抽象类* @author rmling*/
public abstract class XMLDomParseUtil {private static final DocumentBuilderFactory factory;static {factory = DocumentBuilderFactory.newInstance();// 加载 factory单实例}public XMLDomParseUtil() {}/**element的处理 */public abstract Object dealElement(Element element, int index);/**处理更深入一层的标签*/public List<Object> dealElementInTag(Element element, String tagName) { List<Object> ls = new ArrayList<Object>();NodeList elements = element.getElementsByTagName(tagName);for (int index = 0; index < elements.getLength(); index++) {ls.add(dealElement(((Element) elements.item(index)), index));}return ls;}/** 处理最外层标签 */public List<Object> dealElementInTag(Document document, String tagName) {List<Object> ls = new ArrayList<Object>();NodeList elements = document.getElementsByTagName(tagName);for (int index = 0; index < elements.getLength(); index++) {Element element = (Element) elements.item(index);ls.add(dealElement(element, index));}return ls;}/** 获取document */public static Document getDocument(String xmlPath) {Document document = null;try {File file = new File(xmlPath);if(file.exists() && file.isFile()){InputStream inputStream = new FileInputStream(file);//实例化一个DocumentBuilder对象DocumentBuilder builder = factory.newDocumentBuilder();//使用DocumentBuilder对象获取一个Document的对象document = builder.parse(inputStream);}else{System.out.println("文件不存在:"+xmlPath);}} catch (Exception e) {e.printStackTrace();}return document;}
}

2.2 待解析xml文件示例

<?xml version="1.0" encoding="UTF-8"?>
<process name="test" xmlns="http://jbpm.org/4.4/jpdl"><start g="207,-11,72,48" name="start1"><transition g="15,-10" name="to task1" to="检验任务"/></start><task candidate-groups="testCandicateGroup" g="147,50,159,52" name="检验任务"><transition name="to judge" to="judge" g="-55,-8"/></task><decision g="202,127,48,48" name="judge"><handler class="TeleControlDecisionHandler" /><transition g="-36,-10" name="成功" to="检验通过任务"/><transition g="359,152:-31,-20" name="失败" to="检验未通过任务"/><transition g="108,151:38,-22" name="超时" to="超时处理任务"/></decision><task g="301,205,122,52" name="检验未通过任务"></task><task g="61,202,92,52" name="超时处理任务"></task><task g="151,207,151,52" name="检验通过任务"><transition name="to success_end" to="success_end" g="-89,-10"/></task><end g="200,283,48,48" name="success_end" state="success"/>
</process>

2.3 解析xml文件

2.3.1 新建一个用于存储xml文件中各节点的属性和属性值的类

  这里我们只示例解析节点及其子节点的过程:
1、新建Task实体:

/*** 创建task标签对应的实体类*  <task candidate-groups="testCandicateGroup" g="147,50,159,52" name="检验任务"><transition name="to judge" to="judge" g="-55,-8"/></task>*/
class Task{private String candidate_groups;private String g;private String name;private List<Transition> transitions;public Task(String candidate_groups,String g,String name,List<Transition> transitions){this.candidate_groups = candidate_groups;this.g = g;this.name = name;this.transitions = transitions;}public void printLog(){if(transitions != null && transitions.size() > 0){System.out.println("  <task candidate-groups='"+candidate_groups+"' g='"+g+"' name='"+name+"'>");for(Transition t:transitions){System.out.println("    <transition name='"+t.getName()+"' to='"+t.getTo()+"' g='"+t.getG()+"'/>");}System.out.println("  </task>");}else{System.out.println("  <task candidate-groups='"+candidate_groups+"' g='"+g+"' name='"+name+"'/>");}}
}

2、新建Transition实体:

/*** 创建transition标签对应的实体类*  <transition name="to judge" to="judge" g="-55,-8"/>*/
class Transition{private String name;private String to;private String g;public Transition(String name,String to,String g){this.name = name;this.to = to;this.g = g;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}public String getG() {return g;}public void setG(String g) {this.g = g;}
}

2.3.2 解析实际节点

  创建实际解析的业务类,如下:

public class ParseJbpmXml{private Document document;public ParseJbpmXml(String xmlPath) {this.document = XMLDomParseUtil.getDocument(xmlPath);}public List<Task> parseTaskNodes(){List<Task> taskList = new ArrayList<Task>();List<Object> os = new XMLDomParseUtil() {                                                     // 匿名内部类嵌套@Overridepublic Object dealElement(Element element, int index) {return new Task(element.getAttribute("candidate_groups"),element.getAttribute("g"),element.getAttribute("name"),parseTransitionNodes(element));}}.dealElementInTag(document, "task"); if(os != null){for(Object o:os){if(o instanceof Task){taskList.add((Task)o);}}}return taskList;}/*** 解析transition节点*/private List<Transition> parseTransitionNodes(Element element){List<Transition> trans = new ArrayList<Transition>();List<Object> os = new XMLDomParseUtil() {@Overridepublic Object dealElement(Element element, int index) {return new Transition(element.getAttribute("name"),element.getAttribute("to"),element.getAttribute("g"));}}.dealElementInTag(element, "transition");   if(os != null){for(Object o:os){if(o instanceof Transition){trans.add((Transition)o);}}}return trans;}
}

2.4 测试

public static void main(String[] args) {ParseJbpmXml parse = new ParseJbpmXml("D:\\eclipse_powflow\\workspace\\Test\\src\\xml\\test.xml");List<Task> taskList = parse.parseTaskNodes();if(taskList != null){for(int i = 0;i<taskList.size();i++){System.out.println("--  task "+(i+1)+":  --");taskList.get(i).printLog();}}}

结果输出如下:

源码链接:源码-使用java编写以DOM方式解析某目录下的特定XML文件.

Java - XML文件解析相关推荐

  1. java xml文件解析工具_Xml文件解析工具 - java

    解析Xml文件:就是把Xml文件里面的内容取出来. Xml文件解析工具:一个能解析Xml文件的类,即一个能把Xml文件里面的内容取出来的类. 先给出一个Xml文件(student_infor.xml) ...

  2. Java xml文件解析

    什么是xml文件? xml文件是可扩展标记语言.标准通用标记语言的子集. xml文件的后缀为.xml 例如 students.xml <?xml version="1.0" ...

  3. java怎么xml文件解析_Java对Xml文件解析

    JAVA 解析 XML 通常有两种方式,DOM 和 SAX. DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一 ...

  4. XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML

    XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 以及查找xml文件中相同的节点属性值 项目背景:这是本人实习中所碰到的项目,当时感觉很棘手, ...

  5. Android开发历程_18(XML文件解析)

    前言  本文主要介绍在Android中怎样来解析XML文件.主要采用的是SAX机制,SAX全称为Simple API for XML,它既是一种接口,也是一个软件包.作为接口,SAX是事件驱动型XML ...

  6. java xml dom4j 解析_Java使用DOM4J解析XML

    Dom4J方式解析XML文件.dom4j是非官方提供的xml文件解析方式,因此需要去第三方下载dom4j的jar包 File file = new File("D:\\chengmuzhe\ ...

  7. dom4j工具类_基于DOM4J的XML文件解析类

    XML文件解析分四类方式:DOM解析:SAX解析:JDOM解析:DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于ja ...

  8. Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)

    Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它 ...

  9. XML - XML学习/XML文件解析器(C++)实现

    XML - XML学习/XML文件解析器(C++)实现 XML概述 ​ XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识.它也是元标记语言,用于定义其他与特定领域有关的, ...

最新文章

  1. 操作系统(四)操作系统的运行机制
  2. 洛谷2296 寻找道路
  3. android 获取wifi的加密类型,wifi加密类型
  4. 信息学奥赛C++语言:推销产品
  5. python 抽样函数_python中resample函数实现重采样和降采样代码
  6. java 中类型后面三个点的用法
  7. Oracle 关于WKT构造SDO_GEOMETRY的问题。
  8. python 进制间相互转换
  9. 中文字体的英文名称(宋体 微软雅黑)
  10. 【超图+CESIUM】【基础API使用示例】18、超图|CESIUM - 标绘点位:Cesium.DrawHandler绘制点位Cesium.DrawMode.Point
  11. MacOS升级Catalina后32位锐捷客户端排坑历程
  12. 机器人操作系统ROS(9)Gazebo物理仿真(摄像头仿真)
  13. 【爬虫+数据可视化】Python爬取CSDN博客访问量数据并绘制成柱状图
  14. ORACLE 习题(一)
  15. c语言双精度浮点数,使用C语言的十进制(浮点数,双精度)
  16. 用户记忆设计:如何设计印象深刻的用户体验 | Viget
  17. 2020-11-27 PMP 群内练习题 - 光环
  18. oracle客户端没有sqlldr命令,关于oracle的sqlldr或sqlplus命令没响应的问题
  19. java sha1withrsa公钥加密,sha1withrsa在线加密
  20. 16级C++第三次上机解题报告

热门文章

  1. 悉数微软Windows帝国幕后10大关键人物(图)
  2. 淘宝API 商品详情接口
  3. 拉丁方阵问题。(数组版)
  4. php微信支付证书过期,微信支付API证书到期后如何续期?
  5. 服务器虚拟内存设置一下,服务器虚拟内存设置一下
  6. html clear的作用,css中clear的作用是什么?
  7. 无限火力测试服连不上服务器,无限火力回归!LOL美服测试服新版本已登陆
  8. 电脑全屏闪回桌面问题
  9. Linux中的文件解压
  10. 解决unresolved symbol _RamfuncsLoadEnd