首页 > 代码库 > Dom4j读取xml文件——JAVA

Dom4j读取xml文件——JAVA

        前几天,用Dom4j写了三个版本的读取XML文件,现在分享下。

第一版本:

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=http://www.mamicode.com/forwardElement.getText();>

输出结果如下:

      

思考:

        此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文件的代码,其实也是我的一个思考过程,通过别人的引申来扩展自己,积极思考,会带来不一样的收获。