`

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

阅读更多

前面已经了解了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 {

	/**
	 * 姓名
	 */
	@Element
	private 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()
	 */
	@Override
	public 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数据的文章。

 

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

 

  • 大小: 10.9 KB
分享到:
评论

相关推荐

    XML解析器————

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用在数据交换、配置文件、...总之,Xerces-J-bin.2.9.1是一个强大的XML解析库,提供丰富的功能和优秀的性能,是Java开发者处理XML文档的重要工具。

    手把手教你通过java解析xml(csdn)————程序.pdf

    本教程将带你逐步了解如何使用Java解析XML文件。 首先,我们需要明白XML的基本结构。XML文档由元素(Element)、属性(Attribute)、文本内容(Text Content)和注释(Comment)组成。在给定的XML示例中,`...

    simple-xml2object-1.0.0

    《简单实用:XML与对象之间的转换工具——simple-xml2object-1.0.0》 在信息技术领域,数据交换和存储的方式多种多样,其中XML(eXtensible Markup Language)因其结构化、可扩展性及跨平台特性,被广泛用于数据...

    Java解析xml的包--xerces.jar 用于开发xml相关的内空的包..zip

    Java解析XML的包——Xerces.jar是Java开发中用于处理XML文档的重要工具。XML(eXtensible Markup Language)是一种结构化数据表示语言,广泛应用于数据交换、配置存储和文档处理等领域。Xerces.jar包含了Apache ...

    解析xml的jar包

    本文将深入探讨XML解析的基本概念、常用方法以及相关的Java库——JDOM。 XML文档由一系列元素构成,每个元素都包含标签、属性和内容。解析XML的过程就是识别这些元素,提取所需信息,并将其转化为内存中的数据结构...

    Java动态解析XML

    在Java编程中,XML(可扩展标记语言)是一种常见的数据交换格式,用于存储和传输结构化数据。在给定的代码段中,我们看到一个名为`AnalyzeAndBuildXml`的类,它包含了一个用于解析特定格式XML的方法——`analysisXml...

    Android XML解析——Sax解析XML

    XML解析是将XML文档转换为应用程序可以处理的数据的过程。本篇文章将重点讨论Android中的SAX(Simple API for XML)解析器,这是一种事件驱动的解析方法,适合处理大文件或内存有限的设备。 ### SAX解析原理 SAX...

    Android创建与解析XML(三)——详解Sax方式

    SAX解析XML的基本流程是:创建SAXParserFactory,通过该工厂实例化SAXParser,然后设置事件处理器(ContentHandler),最后解析XML文档。以下是SAX解析的关键步骤: - 首先,通过`SAXParserFactory.newInstance()`...

    Java解析XML的方法

    通过对Java解析XML的四种方法——DOM、SAX、StAX和JDOM的介绍,我们可以看到每种方法都有其适用的场景。在实际应用中,根据具体的项目需求和资源限制,选择合适的解析方式是非常重要的。希望本文能够帮助开发者更好...

    java 解析xml

    本篇文章将深入探讨Java解析XML的几种主要方法,以及相关的知识点。 首先,Java提供了两种主要的API来解析XML:DOM(Document Object Model)和SAX(Simple API for XML)。DOM解析器将整个XML文档加载到内存中,...

    Java中四种XML解析技术分析对比

    本篇文章将深入探讨四种主要的XML解析技术——DOM、SAX、StAX以及JAXB,并进行详细的分析与对比。 1. DOM(Document Object Model) DOM解析器将整个XML文档加载到内存中,形成一个树形结构,即DOM树。这种解析方式...

    Android基础——XML数据的三种解析方式

    总结来说,Android中解析XML时,DOM适用于小型且需要频繁访问的文件,SAX和Pull解析适合大型文件或资源有限的环境。选择哪种解析方式取决于具体应用场景和性能需求。理解并熟练掌握这三种解析方式,将有助于提升...

    Java与XML读写之DOM篇

    Java与XML的交互是开发中常见的一种数据处理方式,特别是在需要处理结构化数据时。DOM(Document Object Model)是一种在Java中处理XML的标准方法,它将XML文档转换为一棵对象树,使得我们可以方便地访问和修改XML...

    Android创建与解析XML(二)——详解Dom方式

    Dom方式创建与解析XML文档是一种使用编程语言,如Java,在Android平台实现的方式。这种方式利用了DOM(文档对象模型)的API,其中JAXP(Java API for XML Processing)提供的DocumentBuilder类是用来创建和解析XML...

    simple-demo.rar

    《简易示例——深入解析"simple-demo.rar"》 在我们面前的是一个名为"simple-demo.rar"的压缩包文件,它被标记为"123",这可能代表了某种特定的分类或版本号。虽然标签信息较为简洁,但我们可以通过解压这个文件来...

    安卓Android源码——比较通用的xml解析方法.rar

    本资料包“安卓Android源码——比较通用的xml解析方法”将深入探讨在Android平台上解析XML的多种方法。 1. DOM解析器(Document Object Model) DOM解析器将整个XML文档加载到内存中,创建一个树形结构,便于遍历和...

    android开发之xml文件操作——SAX

    在Android项目中,我们通常需要以下步骤来使用SAX解析XML: 1. 创建一个继承自`DefaultHandler`的类,比如我们可以命名为`MySAXHandler`。在这个类中,我们需要重写`startElement`、`endElement`和`characters`方法...

    dubbo-monitor-simple-3.0.0-SNAPSHOT-assembly.tar.gz

    Dubbo作为一款高性能、轻量级的Java RPC框架,提供了强大的服务治理能力,其中包括服务监控功能。本文将深入探讨Dubbo的监控组件——dubbo-monitor-simple,主要基于3.0.0-SNAPSHOT版本,以帮助开发者更好地理解和...

    xml实用技术教程—— 顾兵

    三、XML解析与处理 1. DOM(Document Object Model):DOM将XML文档解析为一棵树形结构,通过编程语言访问和操作节点,实现数据的读取和修改。 2. SAX(Simple API for XML):SAX是一种基于事件驱动的解析方式,...

Global site tag (gtag.js) - Google Analytics