前面已经了解了DOM和SAX两种解析方式,通过对比知道了DOM解析的核心是建立树模型,而SAX解析的核心是通过回调机制来实现。本篇文章将继续带大家用一种更为强大更为简单的工具来解析XML数据。我这里给大家提供的是simple-xml-2.7.1,已上传至附件,下载解压后把该文件夹下的jar文件夹的包导入到Eclipse中就可。关于将第三方包导入Eclipse项目中方法,我这里就不再赘述了,网上有很多教程。我们的重点是如何利用它去解析XML文件。
simple-xml的解析和创建XML的方式是以注解为基础。这里我们先将怎么使用它创建XML,然后再读取并解析这个创建的XML文件。
假设我们现在需要创建一个p.xml的文件,效果如下:
jack 186 139 150 rose 131 tom
同样我们需要创建一个与该XML文件对应的模型类,相比大家都知道应该是Person.java了。
但是,仔细观察这个xml文件可以发现与我们之前的XML文档都不一样,之前的每个类中的子标签是固定的,而这里
一、创建一个与XML文件对应的模型类——Person.java
@Root public class Person { /** * 姓名 */ @Element private String name; /** * 电话号码 */ @ElementList(inline = true, entry = "phone", required = false) private Listphones; /** * */ 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 getPhones() { return phones; } /** * @param phones * the phones to set */ public void setPhones(List 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文件中还有一个外层标签
@Root(name = "persons") public class PersonList { @ElementList(inline = true) private Listlist; public PersonList() { list = new ArrayList<>(); } public void add(Person p) { list.add(p); } public List 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,可以看看运行效果,如下:
jack 186 139 150 rose 131 tom
可以看到当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); Listlist = pList.getList(); // 打印输出获得的xml文件信息 for (Person person : list) { System.out.println(person); } } catch (Exception e) { e.printStackTrace(); } } }
六、读取的运行结果
可以看到phone不是必须的也可以成功读取。
之后会更新一篇解析json数据的文章。
谢谢您的关注和阅读,文章不当之处还请您不吝赐教~~~