前几天,用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-10-11 04:52:45