java 操作 xml 看了这一篇再去选择具体技术
Posted 还差的远呢
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 操作 xml 看了这一篇再去选择具体技术相关的知识,希望对你有一定的参考价值。
在java的世界里,xml这块领域被两种黑暗势力所统治:XML API 和 OXMapping(Object-XML Mapping)。XML API 下有:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析四大魔王;而OXMapping下则有XStream 、 Digester 、 Castor 等众多猛将。
我们先来看看XML API 这股黑暗势力:
作为XML处理的元老,秉承工匠精神,XML API 通过对xml的底层的操作,让我们能够很好的解析xml文件。其中DOM解析与SAX解析属于基础方法,是官方提供的平台无关的解析方式,使用之广自不必说。而JDOM解析和DOM4J解析则是两个元老的入门弟子,针对java语言专门做了一定的语言特性处理与扩展,使得在java中使用此二人处理xml变得游刃有余。
介绍了XML API 家族势力,我们再来看看OXMapping这股黑暗势力:
作为xml解析领域的后起之秀,OXMapping如今也是混的风生水起,其创作者们秉承了ORMapping的思想,我们可以将 XML 文件映射成一个 JavaBean 对象,也可以把一个 JavaBean 对象保存成一个 XML 文件,这大大简化了我们的开发工作量,使得开发人员能更多的关注应用层面的东西。开源世界中涌现出很多 OXMapping 框架,包括 XStream 、 Digester 、 Castor 等。他们的思想也都是类似ORMapping的思想。但是,正所谓姜还是老的辣,OXMapping 内部实现还是使用 XML API 来完成。
两股势力在xml领域都混的风生水起,可是面对众多的能人上将,选择哪个去处理我们的xml呢?不多bb,直接给出答案,在我们java届,好用且用的最多的XML API 中当属DOM4J,而OXMapping中,则当属XStream。
DOM4J优势如下:1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。2、它使用接口和抽象基本类方法。3、具有性能优异、灵活性好、功能强大和极端易用的特点。4、是一个开放源码的文件。5、采用了Java集合框架并完全支持DOM,SAX和JAXP。DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
XStream优势如下:与 Digester 比起来, XStream 的主要优点就是更加小巧,使用也更加方便,不过目前使用 Digester 是“开源名牌” Apache 下的子项目,但是用起来略显繁琐,而 XStream 比较简洁,所以XStream 还是比较受欢迎。而 Castor 则需要写一个和 Hibernate 中 cfg.xml 类似的映射配置文件,使用上就更显繁琐啦。
所以,综上所述,我们了解和学习DOM4J和XStream就可以了。
那么我们下面就通过一些简单的例子来了解DOM4J和XStream吧(具体或更深入的学习和使用就不再这里说啦,说也说不完,毕竟人家可是一个领域的巨头啊,我一两句话说能说清楚,那不是伪巨了不是):
Dom4J:
1public class DOM4JTest {
2 private static ArrayList<Book> bookList = new ArrayList<Book>();
3 /**
4 * @param args
5 */
6 public static void main(String[] args) {
7 // 解析books.xml文件
8 // 创建SAXReader的对象reader
9 SAXReader reader = new SAXReader();
10 try {
11 // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
12 Document document = reader.read(new File("src/res/books.xml"));
13 // 通过document对象获取根节点bookstore
14 Element bookStore = document.getRootElement();
15 // 通过element对象的elementIterator方法获取迭代器
16 Iterator it = bookStore.elementIterator();
17 // 遍历迭代器,获取根节点中的信息(书籍)
18 while (it.hasNext()) {
19 System.out.println("=====开始遍历某一本书=====");
20 Element book = (Element) it.next();
21 // 获取book的属性名以及 属性值
22 List<Attribute> bookAttrs = book.attributes();
23 for (Attribute attr : bookAttrs) {
24 System.out.println("属性名:" + attr.getName() + "--属性值:"
25 + attr.getValue());
26 }
27 Iterator itt = book.elementIterator();
28 while (itt.hasNext()) {
29 Element bookChild = (Element) itt.next();
30 System.out.println("节点名:" + bookChild.getName() + "--节点值:" + bookChild.getStringValue());
31 }
32 System.out.println("=====结束遍历某一本书=====");
33 }
34 } catch (DocumentException e) {
35 // TODO Auto-generated catch block
36 e.printStackTrace();
37 }
38 }
39}
XStream(XStream将xml转Map,实用方便):
1public class PojoMapConverter implements Converter {
2 public PojoMapConverter() {
3 super();
4 }
5
6 public boolean canConvert(Class clazz) {
7 String classname = clazz.getName();
8 if (classname.indexOf("Map") >= 0
9 || classname.indexOf("List") >= 0
10 || classname.indexOf("Bean") >= 0)
11 return true;
12 else
13 return false;
14 }
15
16 public void marshal(Object value, HierarchicalStreamWriter writer,
17 MarshallingContext context) {
18
19 map2xml(value, writer, context);
20 }
21
22 protected void map2xml(Object value, HierarchicalStreamWriter writer,
23 MarshallingContext context) {
24 boolean bMap = true;
25 String classname = value.getClass().getName();
26
27 bMap = (classname.indexOf("List") < 0);
28 Map<String, Object> map;
29 List<Object> list;
30 String key;
31 Object subvalue;
32 if (bMap) {
33 map = (Map<String, Object>) value;
34 for (Iterator<Map.Entry<String, Object>> iterator = map.entrySet()
35 .iterator(); iterator.hasNext();) {
36 Map.Entry<String, Object> entry = (Map.Entry<String, Object>) iterator
37 .next();
38 key = (String) entry.getKey();
39 subvalue = entry.getValue();
40 writer.startNode(key);
41 if (subvalue.getClass().getName().indexOf("String") >= 0) {
42 writer.setValue((String) subvalue);
43 } else {
44 map2xml(subvalue, writer, context);
45 }
46 writer.endNode();
47 }
48
49 } else {
50 list = (List<Object>) value;
51 for (Object subval : list) {
52 subvalue = subval;
53 writer.startNode("child");
54 if (subvalue.getClass().getName().indexOf("String") >= 0) {
55 writer.setValue((String) subvalue);
56 } else {
57 map2xml(subvalue, writer, context);
58 }
59 writer.endNode();
60 }
61 }
62 }
63
64 public Map<String, Object> unmarshal(HierarchicalStreamReader reader,
65 UnmarshallingContext context) {
66 Map<String, Object> map = (Map<String, Object>) populateMap(reader,
67 context);
68 return map;
69 }
70
71 protected Object populateMap(HierarchicalStreamReader reader,
72 UnmarshallingContext context) {
73 boolean bMap = true;
74 Map<String, Object> map = new HashMap<String, Object>();
75 List<Object> list = new ArrayList<Object>();
76 while (reader.hasMoreChildren()) {
77 reader.moveDown();
78 String key = reader.getNodeName();
79 Object value = null;
80 if (reader.hasMoreChildren()) {
81 value = populateMap(reader, context);
82 } else {
83 value = reader.getValue();
84 }
85 if (bMap) {
86 if (map.containsKey(key)) {
87 // convert to list
88 bMap = false;
89 Iterator<Map.Entry<String, Object>> iter = map.entrySet()
90 .iterator();
91 while (iter.hasNext())
92 list.add(iter.next().getValue());
93 // insert into list
94 list.add(value);
95 } else {
96 // insert into map
97 map.put(key, value);
98 }
99 } else {
100 // insert into list
101 list.add(value);
102 }
103 reader.moveUp();
104 }
105 if (bMap)
106 return map;
107 else
108 return list;
109 }
110}
111
112 public static void main(String[] args) {
113
114 String xml = "<map><stars><star><id>1</id><name>littleflower</name></star><star><id>2</id><name>littleyellow</name></star></stars> <filename>cnlab</filename> <ra>147.0</ra> <dec>0.0</dec> <plate>0.0</plate> <mdj>0.0</mdj> </map> ";
115
116 XStream xstream = new XStream(new DomDriver());
117 xstream.registerConverter(new PojoMapConverter());
118 Map<String, Object> map = (Map<String, Object>)xstream.fromXML(xml);
119 System.out.println(map);
120 xml = xstream.toXML(map);
121 System.out.println(xml);
122 System.out.println((Map<String, Object>)xstream.fromXML(xml));
123}
好啦,对于菜鸟来说,了解这些应该对于xml的解析及使用技术就差不多足够了。
本文代码及内容参考:
https://blog.csdn.net/thunder09/article/details/5555946
http://www.cnblogs.com/longqingyang/p/5577937.html
http://guobin6125.iteye.com/blog/1535612
以上是关于java 操作 xml 看了这一篇再去选择具体技术的主要内容,如果未能解决你的问题,请参考以下文章
10天8000字, 我总结了这一篇Spring容器管理知识大全, 系统化学习Spring