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

Dom4j读取xml文件——JAVA

时间: 2024-08-09 04:15:47

Dom4j读取xml文件——JAVA的相关文章

dom4j读取xml文件

日后我会继续完善的(就写一个读取确实差劲欸) import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.util.Iterator; public class Demo002 { public static void main(String [] args){ SAXReader saxRea

Dom4j读取xml文档

package gz.itcast.a_dom4j_read; import java.io.File; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; /** * 第一个Dom4j读取xml文档的例子 * @author APPle * */ public class Demo1 { public static void main(String[] arg

【java项目实战】dom4j解析xml文件,连接Oracle数据库

简介 dom4j是由dom4j.org出品的一个开源XML解析包.这句话太官方,我们还是看一下官方给出的解释.如下图: dom4j是一个易于使用的.开源的,用于解析XML,XPath和XSLT等语言的库.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP等编程标准. 特点 dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用的特点,同时它也是一个开放源代码的软件.如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例

java读取XML文件的四种方式

java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>河南省郑州市</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>河南省郑州市二七区&

在java项目中怎样利用Dom4j解析XML文件获取数据

在曾经的学习.net时常常会遇到利用配置文件来解决项目中一些须要常常变换的数据.比方数据库的连接字符串儿等.这个时候在读取配置文件的时候.我们一般会用到一个雷configuration,通过这个类来进行直接读取,能够说这是程序中直接封装好的,包含配置文件里书写的格式等等.那么,假设.想要在配置文件里写一些其它的数据,直接以XML文件的格式进行书写.这个时候在后台怎样读取XML文件里的数据呢?这里利用Dom4j来解析XML文件里连接oracle数据库的xml数据. 在使用之前,首先要在自己的项目中

在java项目中如何利用Dom4j解析XML文件获取数据

在以前的学习.net时经常会遇到利用配置文件来解决项目中一些需要经常变换的数据,比如数据库的连接字符串儿等.这个时候在读取配置文件的时候,我们通常会用到一个雷configuration,通过这个类来进行直接读取,可以说这是程序中直接封装好的,包括配置文件中书写的格式等等.那么,如果,想要在配置文件中写一些其他的数据,直接以XML文件的格式进行书写,这个时候在后台如何读取XML文件中的数据呢?这里利用Dom4j来解析XML文件中连接oracle数据库的xml数据. 在使用之前,首先要在自己的项目中

java dom4j 解析XML文件 简易教程

XML 来自: W3School XML 被设计用来传输和存储数据. HTML 被设计用来显示数据. 什么是 XML? eXtensible Markup Language XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被预定义.您需要自行定义标签. XML 被设计为具有自我描述性. XML 是 W3C 的推荐标准 XML 与 HTML 的主要差异 XML 不

java读取xml文件的三种方法

xml既简单又标准,值得拥有和学习,好多地方都用的到.假设有这么一个book.xml: <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Copyright w3school.com.cn --> <!-- W3School.com.cn bookstore example --> -<bookstore> -<book category="childre

使用DOM4J解析XMl文件与读取XML文件

XML文件 1 <?xml version="1.0" encoding="UTF-8"?> 2 <bookstore> 3 <book id="1"> 4 <name>冰与火之歌</name> 5 <author>乔治马丁</author> 6 <year>2014</year> 7 <price>89</price&g