`

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics