前面已经了解了DOM和SAX两种解析方式,通过对比知道了DOM解析的核心是建立树模型,而SAX解析的核心是通过回调机制来实现。本篇文章将继续带大家用一种更为强大更为简单的工具来解析XML数据。我这里给大家提供的是simple-xml-2.7.1,已上传至附件,下载解压后把该文件夹下的jar文件夹的包导入到Eclipse中就可。关于将第三方包导入Eclipse项目中方法,我这里就不再赘述了,网上有很多教程。我们的重点是如何利用它去解析XML文件。

simple-xml的解析和创建XML的方式是以注解为基础。这里我们先将怎么使用它创建XML,然后再读取并解析这个创建的XML文件。

假设我们现在需要创建一个p.xml的文件,效果如下:

<persons><person><name>jack</name><phone>186</phone><phone>139</phone><phone>150</phone></person><person><name>rose</name><phone>131</phone></person><person><name>tom</name></person>
</persons>

同样我们需要创建一个与该XML文件对应的模型类,相比大家都知道应该是Person.java了。

但是,仔细观察这个xml文件可以发现与我们之前的XML文档都不一样,之前的每个类中的子标签是固定的,而这里<person>标签下的子标签除了<name>外,<phone>的数量并不唯一。这个时候我们要怎么设置这个Person类的字段呢?其实很简单,因为<phone>标签是不唯一且不确定的,所以我们可以将其放在一个列表(如ArrayList)里面,并且,使用simple-xml处理类中的对象字段也是非常好用的。那么我们首先来创建一个Person类吧

一、创建一个与XML文件对应的模型类——Person.java

@Root
public class Person {/*** 姓名*/@Elementprivate String name;/*** 电话号码*/@ElementList(inline = true, entry = "phone", required = false)private List<String> phones;/*** */public Person() {phones = new ArrayList<>();}/*** @param name* @param phones*/public Person(String name) {this();this.name = name;}/*** @return the name*/public String getName() {return name;}/*** @param name*            the name to set*/public void setName(String name) {this.name = name;}/*** @return the phones*/public List<String> getPhones() {return phones;}/*** @param phones*            the phones to set*/public void setPhones(List<String> phones) {this.phones = phones;}/*** 新增一个电话号码* * @param phone*/public void addPhone(String phone) {phones.add(phone);}/** (non-Javadoc)* * @see java.lang.Object#toString()*/@Overridepublic String toString() {return "Person [" + (name != null ? "name=" + name + ", " : "") + (phones != null ? "phones=" + phones : "")+ "]";}}

仔细观察Person.java中的代码可以发现,类上面加了一个@Root,字段上面加了@Element两个注解,并且对于列表字段,还为其注解设置了三个属性,inline表示是否内联(待会我会将其设置为false给大家看下运行效果截图),entry表示每个子元素的标签名字,required表示是否为必须标签,很显然,上面的XML文档中最后一个没有phone,所以不是必须标签。

(注意:如果没有引入simple-xml.jar包的话,@Root和@Element会报错)

二、除了person标签外,我们看到需要的xml文件中还有一个外层标签<persons>,所以我们还需要创建一个用来包装Person类列表的包装类,取名为PersonList.java,如下:

@Root(name = "persons")
public class PersonList {@ElementList(inline = true)private List<Person> list;public PersonList() {list = new ArrayList<>();}public void add(Person p) {list.add(p);}public List<Person> getList() {return list;}
}

三、创建一个测试类,创建文章开始要创建的p.xml文件。如下:

public class Test {public static void main(String[] args) {Person p1 = new Person("jack");p1.addPhone("186");p1.addPhone("139");p1.addPhone("150");Person p2 = new Person("rose");p2.addPhone("131");Person p3 = new Person("tom");PersonList personList = new PersonList();personList.add(p1);personList.add(p2);personList.add(p3);// 创建一个传送器对象,使用这个对象可以很快的创建和解析XML文档Persister persister = new Persister();try {// 将Person列表直接写出persister.write(personList, new File("p.xml"));} catch (Exception e) {e.printStackTrace();}}}

四、创建的运行效果

(一)大家运行看下,可以得到和文章开始给出的p.xml一样的文档。

(二)中间我们说了inline这个属性,刚刚我们是让其为true,显示让其为false,可以看看运行效果,如下:

<persons><person><name>jack</name><phones class="java.util.ArrayList"><phone>186</phone><phone>139</phone><phone>150</phone></phones></person><person><name>rose</name><phones class="java.util.ArrayList"><phone>131</phone></phones></person><person><name>tom</name><phones class="java.util.ArrayList"/></person>
</persons>

可以看到当inline为false时,表示该列表不内嵌,而是要单独做一个标签,而列表中的元素是这个标签的自标签,对于正个XML文档而言,inline为true时,phone是第三级标签,而为false时变成了第四季标签。这就是inline这个属性。

五、解析刚刚创建的p.xml文件

public class PersonRead {public static void main(String[] args) {File f = new File("p2.xml");try {// 创建一个传输器,执行其read方法,可以直接获取到PersonList pList = new Persister().read(PersonList.class, f);List<Person> list = pList.getList();// 打印输出获得的xml文件信息for (Person person : list) {System.out.println(person);}} catch (Exception e) {e.printStackTrace();}}}

六、读取的运行结果

可以看到phone不是必须的也可以成功读取。

之后会更新一篇解析json数据的文章。

谢谢您的关注和阅读,文章不当之处还请您不吝赐教~~~

Java解析XML数据(三)——强大的XOM之simple-xml解析相关推荐

  1. python读取xml数据并显示为表格_用Python解析XML数据,然后用SQL创建一个数据库

    我对运行代码后在命令窗口中得到的输出有点困惑.我对每一部分都复习了几遍,我不知道哪里出了问题.在 为什么字典计数打印,但其余打印语句没有显示?我还检查了SQLite文件中的表,表中没有我的数据,只有标 ...

  2. wps解析json数据_浏览器处理2500MB JSON文件的解析与绘图问题(实践分享,非战斗人员请忽略)...

    最近在做一个浏览器画数据图的任务. 任务其实很简单,浏览器通过ajax请求拿到服务端已经生成好的json文件,然后在前端浏览器绘制相应的折线图,饼状图等. 很丑陋的dataflow 起初我的做法 le ...

  3. 简单使用SAXReader解析xml数据

    之前的工作中,一直是使用json格式的数据进行数据传输.很少会接触到xml格式的数据.不过因为工作需求,在对接其他产品的接口时,偶尔会遇到需要使用xml格式数据的情况,所以,也得学学如何解析xml.不 ...

  4. python解析xml数据_Python解析XML数据方法

    Python在采取数据方面真实相当的简洁和方便,对于个人草根站长来说学一点就已经能很好的把自己想要的功能实现:让自己做一个有技术的SEOER,并不困难,可能很多人没学就开始问学Python要多久,零基 ...

  5. python 读取excel格式xml,读取xml格式的xls文件、解析其中数据

    1.python 读取excel格式xml,解析其中数据 当excel文件的格式是xml的时候,window系统是可以正常打开的,但是使用pandas直接读取则会报错,原因就是现在已经是xml文件了, ...

  6. 解析XML数据,必看

    xml源文件 <?xml version="1.0" encoding="UTF-8"?> <humans> <zhangying ...

  7. 数据分析从零开始实战,Pandas读写Excel/XML数据

    点击查看第一篇文章: 数据分析从零开始实战,Pandas读取HTML页面+数据处理解析_ 数据分析 从零开始到实战,Pandas读写CSV数据_ 数据分析 从零开始到实战,Pandas读写CSV数据 ...

  8. 使用DOM读取和维护XML数据

    笔记目录: 1.了解XML解析 2.使用DOM读取和维护XML数据 3.使用DOM4J读取和维护XML数据 1.DOM解析XML的步骤 2.使用DOM解析XML时主要使用的对象 XML中节点有三种:1 ...

  9. Android--序列化XML数据

    什么是XML? 首先我们先了解一下什么是XML.XML,可扩展标记语言 (Extensible Markup Language) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据 ...

  10. XML数据交换的安全解决方案

    摘  要:XML技术的发展使得基于网络的数据交互越来越方便,但是互联网开放性所带来的信息安全隐患却是一个日趋严重的问题.本文分析了基于XML的数据交换安全需求,介绍了XML安全服务标准.针对XML数据 ...

最新文章

  1. 快速上手RaphaelJS-Instant RaphaelJS Starter翻译(一)
  2. html web form id,小程序如何获取多个formId实现详解
  3. 二进制安装kubernetes1.14.1-pod配置清单之客户端访问方式03
  4. ant如何形成时间轴和图库_高中历史时间轴来了(电子高清版),最新最完整的复习时间线整理,这里都有!...
  5. 基础练习 数列特征 c语言
  6. nashorn预编译_Java 8:在新的Nashorn JS引擎中编译Lambda表达式
  7. easyUI 展开DataGrid里面的行显示详细信息
  8. 注册终止处理函数atexit()
  9. 各种变换的原理----DX版本
  10. 移动端input“输入框”常见问题及解决方法
  11. [Extjs6] 修改默认的日期月份格式
  12. 微信8.0下载(可抓包)
  13. 计算机打印状态错误,打印机状态错误【设置办法】
  14. 用C++写洛谷P1427小鱼的数字游戏
  15. 第16章Stata面板数据分析
  16. Andriod 获取手机CPU型号设备信息
  17. 关于win10重新安装应用商店(Microsoft Store)的解决方案
  18. 8分频verilog线_时钟分频系列——分数分频电路的Verilog实现
  19. cocos2d-x的初步学习二十之坦克大战七
  20. 智能扭矩系统——SunTorque智能扭矩系统,引领拧紧工艺新变革!

热门文章

  1. linux games账号,在Linux上能玩Epic Games Store,附安装和使用方法
  2. USB、串口、422、485、CAN接口互转模块
  3. FPGA SCCB协议
  4. 2023最新聚支付系统源码/已去除授权+支持易支付和码支付
  5. 实现数据库的跨库join联表查询
  6. 创建 RegisterAction
  7. 怎么从cad的表格弄到excel里转换成Excel表格?
  8. 如何本地安装chisel bootcamp
  9. 财务系统软件c语言,用vc++6.0编写一个简单的财务应用程序来计算职工所得的实际工资...
  10. 深度学习之3D卷积神经网络