关于xml的知识,及作用什么的就不说了,直接解释如何使用dom4j解析。假如有如下xml:
dom4j解析xml其实很简单,只要你有点java基础,知道xml文件。结合下面的xml文件和java代码,多看几遍(代码很简单,不要嫌看代码烦),把他解析的过程看明白,就会很简单
<?xml version="1.0" encoding="UTF-8"?> <students> <student> <name type="String">aaa</name> <age type="int">22</age> </student> <student> <name type="String">bbb</name> <age type="int">23</age> </student> <student> <name type="String">ccc</name> <age type="int">21</age> </student> </students>
加入我们解析上面这个xml文件,无非是想得到其中的 name值,age值,有时候还需要type值
使用到的类有:org.dom4j.io.SAXReader;
--read 提供多种读取xml文件的方式,返回一个Domcument对象
org.dom4j.Document;
--iterator 使用此法获取node
--getRootElement 获取根节点
org.dom4j.Attribute;
--getName 获取属性名
--getValue 获取属性值
org.dom4j.Element;
--attributes 返回该元素的属性列表
--attributeValue 根据传入的属性名获取属性值
--elementIterator 返回包含子元素的迭代器
--elements 返回包含子元素的列表
下面看一下java代码
public static void domxml() throws Exception { // SAXReader就是一个管道,用一个流的方式,把xml文件读出来 SAXReader reader = new SAXReader(); // read 提供多种读取xml文件的方式,返回一个Domcument对象 Document document = reader.read(new File("F:" + File.separator + "student.xml")); // 获取根节点 Element rootElement = document.getRootElement(); System.out.println("根的名称:" + rootElement.getName());// 拿到根节点的名称 Iterator iter = rootElement.elementIterator(); // 获取根节点下的子节点 while (iter.hasNext()) { StringBuffer sb = new StringBuffer(""); // 子节点 Element nodeElement = (Element) iter.next(); // System.out.println("-根下第一层节点名称:"+nodeElement.getName()+",值"+nodeElement.getText()); sb.append("" + nodeElement.getName() + ":"); // 节点属性 Iterator i = nodeElement.elementIterator(); while (i.hasNext()) { Element e = (Element) i.next(); // System.out.println("--根下第二层节点名称:"+e.getName()+",节点值:"+e.getText()); sb.append(e.getName() + "-" + e.getText() + ";"); //遍历节点属性值 List<Attribute> attr=e.attributes(); for(Attribute a:attr){ System.out.println("---节点属性:"+a.getName()+",属性值"+a.getText()); } } System.out.println(sb); sb = null; } }
如果你看明白了上面的代码,看懂了,你肯定会绝得这里嵌套了两个while,加入有三层的话,是不是得写三个while?
不知道你看我上面的代码后有什么想法?反正我弄明白之后,立马就想到了改用递归写这个解析的方法,于是代码如下:
public static void dgXml(Element element) { if (element.nodeCount() > 0) {// 还有子节点 Iterator<?> it = element.elementIterator(); while (it.hasNext()) { Element e = (Element) it.next(); String name = e.getName(); String value = e.getTextTrim().equals("")? "空": e.getTextTrim(); System.out.print(name + "," + value+ ";Data["); if(e.attributeCount()>0){ Iterator<?> ait=e.attributeIterator(); while(ait.hasNext()){ Attribute attribute = (Attribute) ait.next(); System.out.print(attribute.getName()+"|"+attribute.getText()+";"); } } System.out.println("]"); dgXml(e); } } }