Java - XML文件解析

article/2025/9/24 9:33:13

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包,用的时候导包就行。
1

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 解析实际节点

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

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();}}}

结果输出如下:
2

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


http://chatgpt.dhexx.cn/article/HwtTQ8Q5.shtml

相关文章

Java解析XML文件的方式

在项目里&#xff0c;我们往往会把一些配置信息放到xml文件里&#xff0c;或者各部门间会通过xml文件来交换业务数据&#xff0c;所以有时候我们会遇到“解析xml文件”的需求。一般来讲&#xff0c;有基于DOM树和SAX的两种解析xml文件的方式&#xff0c;在这部分里&#xff0c;…

java解析xml格式的节点属性值

xml示例&#xff1a; <ResponseContent><Parameter><Document><RecordSet id"1"><Master name"purchase"><Record><Field name"orderNumber" value"1P05-151200172"/><Field name"…

Java解析XML字符串

在网上找了很多Java语言解析XML字符串的资料&#xff0c;很多内容写得很繁复&#xff0c;没有普适性&#xff0c;遂自己动手写了一个用Java解析XML的工具类。话不多说&#xff0c;直接看下面代码&#xff1a; XML解析工具类&#xff1a; import org.dom4j.Document; import o…

JAVA解析xml报文

目录 问题需求 响应报文格式 1&#xff0c;开发导入的依赖 2&#xff0c;开发样例 3&#xff0c;测试结果 问题需求 在工作中此项目请求指定项目之后&#xff0c;项目会返回一个xml报文格式的响应&#xff0c;此时我需要判断返回的报文是否是成功的响应报文&#xff0c;如…

Java解析xml

记录工作中遇到的一些问题和解决方式&#xff0c;自己摘抄整理了一下用来巩固&#xff0c;如有不足或有更好的方式 欢迎交流。 java解析xml的话有四种方式&#xff0c;分别为DOM,SAX,DOM4J,JDOM 转载&#xff1a;Java解析XML(4种方法)_蓝星花的博客-CSDN博客_java解析xml 这里的…

Java解析XML(4种方法)

xml文件 <?xml version"1.0" encoding"utf-8" ?> <class><student><firstname>cxx1</firstname><lastname>Bob1</lastname><nickname>stars1</nickname><marks>85</marks></stud…

混合开发架构|Android工程集成React Native、Flutter、ReactJs

混合开发架构|Android工程集成React Native、Flutter、ReactJs 架构设计说明创建安卓原生工程创建Flutter集成嵌入原生工程 创建React Native解决RN报错问题集成嵌入原生工程RN集成后&#xff0c;启动报错 底部导航栏架构设计原生仿招商银行首页原生Android Socket 即时通讯Rea…

Android MVVM开发框架

MVVM 数据双向绑定&#xff0c;通过数据驱动UI&#xff0c;M提供数据&#xff0c;V视图&#xff0c;VM即数据驱动层 MVP框架图 &#xff08;图片来源于网络&#xff09; 学习MVVM开发框架&#xff0c;要先了解DataBinding&#xff0c;DataBinding 是什么&#xff1f; DataBi…

Android: 开发框架设计

Android 开发框架 Android运用框架的目的不外乎是实现代码的代码解耦、逻辑分类、快速集成 便于维护等目的&#xff1b;Android 开发架构从早期的MVC &#xff0c;到近年到MVP 架构&#xff0c;到最近流行到MVVM 架构。不断到对业务逻辑、代码结构进行分层&#xff0c;便于快速…

安卓框架

http://www.cnblogs.com/jincheng-yangchaofan/articles/7018780.html 框架&#xff1a;提供一定能力的小段程序 一.榜单介绍 排行榜包括四大类&#xff1a; 单一框架&#xff1a;仅提供路由、网络层、UI层、通信层或其他单一功能的框架 混合开发框架&#xff1a;提供开发hy…

安卓应用开发顶级框架大盘点,总有一款适合你

作者 | Slava Vaniukov 译者 | 苏本如&#xff0c;责编 | 夕颜 封图 | CSDN下载自视觉中国 出品 | CSDN&#xff08;ID:CSDNnews&#xff09; 随着软件开发向移动应用的转变&#xff0c;越来越多的企业意识到&#xff0c;移动应用程序对于企业和客户之间建立牢固的联系至关重要…

嵌入式Android底层开发(一)——安卓开发的整体框架与简述

一、Android简介 Android是一种基于Linux内核&#xff08;不包含GUN组件&#xff09;的自由及开放源代码的操作系统&#xff0c;主要使用于移动设备&#xff0c;如智能手机和平板电脑&#xff0c;由美国Google公司和开放手机联盟领导及开发。 主要参数表&#xff1a; 参数上…

Android 框架

背景 我们有一个需求&#xff1a;我们需要查询用户账号信息&#xff0c;用户输入账号&#xff0c;点击按钮可进行查询账号信息&#xff0c;如果查询数据成功&#xff0c;则将数据展示在界面上&#xff1b;如果查询数据失败&#xff0c;则在界面上提升获取数据失败。 假如说我们…

Android - 框架使用

目录 1 Gson解析JSON 1.1 引入依赖 1.2 使用 1.3 安装插件 1.4 Demo 2 下滑刷新&#xff0c;上滑加载新数据 2.1 背景 2.2 引入依赖 2.3 代码实现 3 加载网络图片 3.1 背景 3.2 引入依赖 3.3 代码实现 4 轮播图 4.1 引入依赖 4.2 代码实现 5 网络数据请求 Re…

Android 快速开发框架 集成框架

由于自己经常写项目&#xff0c;没有一个方便开发的一套框架怎么行&#xff0c;所以在日常开发总自己整理了一套&#xff0c;请各位过目&#xff0c;不喜勿喷。一个新项目搭建需要具备的环境:先导入我制作的jar包。添加必要的权限。需要一个Application初始化数据,下面开始调用…

Android应用-开发框架设计

目录 1. &#x1f4c2; 简介 1.1 背景 1.2 专业术语 2. &#x1f531; 总体设计思想 2.1 分层&#xff1a;组件化设计框架 2.2 分类&#xff1a;应用开发架构图 3. ⚛️ 框架详细设计 3.1 组件化框架外形 3.2 业务模块化 3.3 代码编程框架 4. &#x1f4a0; 框架其他…

Android常用框架

1.缓存框架 1.1DiskLruCache&#xff1a;Java实现基于LRU的磁盘缓存&#xff0c;DiskLruCache不是google官方所写&#xff0c;但是得到了官方推荐&#xff0c;DiskLruCache没有编写到SDK中去&#xff0c;如需使用可直接copy这个类到项目中去。使用场景&#xff1a;如“清除…

Android开发框架大全

包括各种快速开发框架、测试框架、系统框架、插件补丁框架、设计模式框架、主题切换框架。 android-tips-tricks&#xff1a; https://github.com/nisrulz/android-tips-tricks Android 开发的一些 Tips 集合 Android-Code-Style&#xff1a; https://github.com/LoranWong/And…

Android开发常用开源框架

Android开源框架系列 Android开源项目 Android开发常用开源框架2 Android开发常用开源框架3 GitHub上最火的Android开源项目,所有开源项目都有详细资料和配套视频 2017年伊始&#xff0c;你需要尝试的25个Android第三方库 Android开发常用第三方平台 免费的计算机编程类中…

Android开发框架模式(MVC、MVP、MVVM)实例解析

Android项目中&#xff0c;尤其是比较大型的项目开发中&#xff0c;模块内部的高聚合和模块间的低耦合性就显得尤为重要了。所以我们一般情况下需要为项目设计一种框架模式&#xff0c;通常情况下我们一般用到的三种MVC、MVP、MVVM。 通过框架模式设计的项目能够极大的提高开发…