第一版本:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<do-config>
<do path="User/adduser" type="UserPackage.UserServlet">
<forward name="Success">AddSuccess.jsp</forward>
</do>
</do-config>
Dom4j读取此xml代码如下:
public static void read() {
try {
// 读取并解析XML文档
// SAXReader就是一个管道,用一个流的方式,把xml文件读出来
SAXReader reader = new SAXReader(); // User.hbm.xml表示你要解析的xml文档
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("NewFile.xml");
Document doc = reader.read(in);
// 获取根节点
Element rootElt = doc.getRootElement();
//获取do节点
Element doElement = rootElt.element("do");
//获取do节点下的属性
String path=doElement.attributeValue("path");
String type=doElement.attributeValue("type");
//获取forward节点
Element forwardElement =doElement.element("forward");
//获取forward节点中的属性和文本值
String name=forwardElement.attributeValue("name");
String value=forwardElement.getText();
System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称
System.out.println("do节点:"+doElement.getName());
System.out.println("do节点的属性path和type分别为:"+path+"、"+type);
System.out.println("forward节点:"+forwardElement.getName());
System.out.println("forward节点属性name为:"+name);
System.out.println("forward节点的文本值为:"+value);
} catch (DocumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
输出结果如下:
思考:
此XML文件相对简单,根节点下有的只是不同的二级节点、三级节点,没有重复的子节点,也就是说没有几个相同的二级节点do或者没有几个相同的三级节点forward。同时在读取的时候,对节点开放,什么意思呢?就是说读取xml的代码中看的到xml文件中的节点。既然有这些问题,应该如何解决呢?看下一个版本。
第二个版本:
XML文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<do-config>
<do path="User/adduser" type="UserPackage.UserServlet">
<forward name="Success">AddSuccess.jsp</forward>
<forward name="Error">Adderror.jsp</forward>
</do>
</do-config>
Dom4j读取xml文件代码如下:
public static void readStringXml() {
// Document doc = null;
try {
// 读取并解析XML文档
// SAXReader就是一个管道,用一个流的方式,把xml文件读出来
SAXReader reader = new SAXReader(); // User.hbm.xml表示你要解析的xml文档
InputStream in = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("NewFile.xml");
Document doc = reader.read(in);
Element rootElt = doc.getRootElement(); // 获取根节点
System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称
for (int i = 0; i < rootElt.nodeCount(); i++) {
Node node = rootElt.node(i);
if (node instanceof Element) {
Element elementTemp = (Element) node;
System.out.println("二级节点do:" + node.getName()); // 拿到第一个二级节点的名称do
// 取得二级节点do的type和path属性的值
for (Iterator iter = elementTemp.attributeIterator(); iter
.hasNext();) {
Attribute item = (Attribute) iter.next();
System.out.println("二级节点do的:" + item.getName() + "为"
+ item.getValue()); // 拿到二级节点的path和type
}
// 获取二级节点的下面的子节点forward(三级节点)
for (Iterator iterroot2 = elementTemp.elementIterator(); iterroot2
.hasNext();) {
Element root22 = (Element) iterroot2.next(); // 得到一个二级节点
System.out.println("三级节点forward:" + root22.getName());
System.out.println("三级节点forward的值:" + root22.getText()); // 获取forward的值
List attrList = root22.attributes(); // 获取三级节点的属性
// 遍历获取三级节点的属性
for (Iterator iter = attrList.iterator(); iter
.hasNext();) {
Attribute item = (Attribute) iter.next();
System.out.println("三级节点forward的属性:"
+ item.getName() + "为" + item.getValue());
}
}
}
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
显示结果如下:
思考:
此方法利用迭代解决了当读取的xml文件中存在有相同节点名的问题,单独看这段读取xml文件的代码,在里面也看不到xml文件中的节点对象和属性了。但是也产生了新的问题,如果根节点下已经不再局限于它的子节点最多为三级,如果节点有四级、五级,乃至更多的时候,应该怎么办?如何解决这个问题呢?看第三个版本
第三版本:
XML
<?xml version="1.0" encoding="UTF-8"?>
<do-config>
<do path="User/adduser" type="UserPackage.UserServlet">
<forward name="Success">AddSuccess.jsp</forward>
<forward name="Error">Adderror.jsp</forward>
</do>
<do path="User/deluser" type="UserPackage.delUserServlet">
<forward name="Error">
<current>zhudan.jsp</current>
</forward>
</do>
</do-config>
Dom4j读取XML代码如下:
public static void readxml() {
SAXReader reader = new SAXReader(); // User.hbm.xml表示你要解析的xml文档
InputStream in = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("NewFile.xml");
try {
Document doc = reader.read(in);
Element root = doc.getRootElement(); // 获取根节点
List<Element> list = new ArrayList<Element>();
list.add(root);
while (list != null) {
Element element = null;
Element ele = null;
Iterator ite = list.iterator();
if (ite.hasNext()) {
ele = (Element) ite.next();
ite.remove();
}
if (ele != null) {
for (Iterator i = ele.elementIterator(); (i != null)
&& (i.hasNext());) {
element = (Element) i.next();
list.add(element);
if (element != null) {
System.out.println(element.getName() + " : "
+ element.getPath() + " --"
+ element.getText());
for (Iterator iter = element.attributeIterator(); iter
.hasNext();) {
Attribute item = (Attribute) iter.next();
System.out.println(item.getName() + "为"
+ item.getValue());
}
}
}
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
运行结果如下:
思考:
这个方法读取XML文件,我就不用担心我的xml文件的内容是什么,节点有多少,节点属性有多少,我只关心xml文件的名字。
总结:
这三个版本的关于Dom4j读取xml文件的代码,其实也是我的一个思考过程,通过别人的引申来扩展自己,积极思考,会带来不一样的收获。