在Java中要对Xml进行解析如果要使用Dom4j方法的话,存入MAP的话,必须先引入包dom4j-1.6.1.jar,jaxen-1.1.1.jar。在编程的时候,记得把这些包引入的Java工程的根目录下面,同时在程序同引入这些包。Eclipse可以右键相应的工程,选择JAVA Build Path->Add External JARs...就可以。
一、目的:是把一个类似于
<A>
<a>
<i>1</i>
<ii>2</ii>
...
</a>
<a>
<i>3</i>
<ii>4</ii>
...
</a>
...
</A>
的XML文档,先拆分成{i=1,ii=2} 与{i=3,ii=4}……的MAP,再合并成[{i=1,ii=2},{i=3,ii=4},...}的List
实质上,MAP与LIST都类似于数组,一系列的变量的集合。只是MAP与LIST可存放的元素与功能都比数组,这种数据结构,强大得多,它们都可以看作一种可以任意遍历的线性表。
二、对于XML的处理
首先,必须把XML通过缓冲区的数据流读入至一个字符串变量之中,然后再进行处理。不管XML是来自网络还是文件,甚至是标准的输入输出都按Java的数据流进行处理,没有任何的区别。
然后,对记录了XML的字符串进行处理:
public static List<Map> readStringXmlOut(String xml) { List<Map> mList = new ArrayList<Map>(); Document doc = null; try { // 将字符串转为XML doc = DocumentHelper.parseText(xml); // 获取根节点 Element root = doc.getRootElement(); // 拿到根节点的名称 // System.out.println("根节点:" + root.getName()); Iterator i = root.elementIterator("a"); while (i.hasNext()) { Map map = new HashMap(); Element e = (Element) i.next(); for (Iterator ii = e.elementIterator(); ii.hasNext();) { Element ee = (Element) ii.next(); // 如果迭代器(游标)遇到content标签则需要进行处理 map.put(ee.getName(), ee.getStringValue()); } mList.add(map); } } catch (DocumentException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return mList; }
2.扔过来的字符串必须放在一个Document类型的变量doc进行处理,通过DocumentHelper.parseText(String)方法,把字符串擦写成Document类型
3.然后使用doc中的getRootElement()方法获取根节点。
4.结点元素都是Element类型,结点元素的迭代器,或者叫游标,也就是类似于指针的东西都是Iterator类型
5.通过强制类型转换,把Iterator类型强行转换成Element类型就是求出迭代器所指的元素
6.Iterator类型下面有next()方法可以把这个指针下移
7.Iterator类型下面有hasNext()方法,返回一个布尔值,可以判断指针下面有没有东西
Iterator i = root.elementIterator("a");意思是迭代器i如果向下拉,是直接拉到下一个<a>结点,无视两个a结点之间存在着多少的结点
Iterator ii = e.elementIterator();意思是迭代器ii如果向下拉,则只是仅仅向下移一个结点,不指定ii寻找的方向。
8.上面代码的意思是,创造两个迭代器(游标),来处理这个由Xml转换成的Document类型的变量doc,然后不停地往下读,读到读完为止,ii的for循环镶嵌在i的while循环里面,ii循环完毕,i则向下拉到下一个<a>结点
<A>
i-> <a>
ii-> <i>1</i>
<ii>2</ii>
...
</a>
<a>
<i>3</i>
<ii>4</ii>
...
</a>
...
</A>
三、对于Map的处理要把XML文档,先拆分成{i=1,ii=2} 与{i=3,ii=4}……的Map,则用到结点元素Element类型下的getName()与getStringValue()方法,map.put(ee.getName(), ee.getStringValue());的意思,是把当前元素的结点名与结点值压到Map当中。例如<i>1</i>,则i是结点名,1是结点值。
通过Map.get("结点名")能把相应的结点值取出来。结点名,结点值都是String类型。
四、对于List的处理
两个迭代器ii与i遍历完,则同时生产完一张完整的Map。
通过mList.add(map);能把这张Map压倒mList中。
程序首部List<Map> mList = new ArrayList<Map>();代表这个list只存MAP。
List的操作相当简单。通过add()、remove()、clear()方法能很好地处理一切。
List这种类型,不需要额外的包,是java.util.*包的基本类型之一。