Dom4j读取xml文件的api(应用程序编程接口)而log4J是用于日志控制的

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节


dom4j1.5的完整版大约13M,是一个名为dom4j-1.5.zip的压缩包,解压后有一个dom4j-1.5.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-4.jar文件,一般也需要引入,否则执行时可能抛java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。

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

第一版本:

XML:

[html] view plain copy print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <do-config>  
  3.     <do path="User/adduser" type="UserPackage.UserServlet">  
  4.         <forward name="Success">AddSuccess.jsp</forward>  
  5.     </do>  
  6. </do-config>  

Dom4j读取此xml代码如下:

[java] view plain copy print ?
  1. public static void read() {  
  2.         try {  
  3.             // 读取并解析XML文档  
  4.             // SAXReader就是一个管道,用一个流的方式,把xml文件读出来  
  5.             SAXReader reader = new SAXReader(); // User.hbm.xml表示你要解析的xml文档  
  6.             InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("NewFile.xml");  
  7.             Document doc = reader.read(in);  
  8.             // 获取根节点  
  9.             Element rootElt = doc.getRootElement();   
  10.             //获取do节点  
  11.             Element doElement = rootElt.element("do");   
  12.             //获取do节点下的属性  
  13.             String path=doElement.attributeValue("path");  
  14.             String type=doElement.attributeValue("type");  
  15.             //获取forward节点  
  16.             Element forwardElement =doElement.element("forward");  
  17.             //获取forward节点中的属性和文本值  
  18.             String name=forwardElement.attributeValue("name");  
  19.             String value=forwardElement.getText();  
  20.             System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称  
  21.             System.out.println("do节点:"+doElement.getName());  
  22.             System.out.println("do节点的属性path和type分别为:"+path+"、"+type);  
  23.             System.out.println("forward节点:"+forwardElement.getName());  
  24.             System.out.println("forward节点属性name为:"+name);  
  25.             System.out.println("forward节点的文本值为:"+value);  
  26.         } catch (DocumentException e) {  
  27.             e.printStackTrace();  
  28.         } catch (Exception e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.     }  

输出结果如下:

      Dom4j读取xml文件的api(应用程序编程接口)而log4J是用于日志控制的_第1张图片

思考:

        此XML文件相对简单,根节点下有的只是不同的二级节点、三级节点,没有重复的子节点,也就是说没有几个相同的二级节点do或者没有几个相同的三级节点forward。同时在读取的时候,对节点开放,什么意思呢?就是说读取xml的代码中看的到xml文件中的节点。既然有这些问题,应该如何解决呢?看下一个版本。

第二个版本:

XML文件如下:

[html] view plain copy print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <do-config>  
  3.     <do path="User/adduser" type="UserPackage.UserServlet">  
  4.         <forward name="Success">AddSuccess.jsp</forward>  
  5.         <forward name="Error">Adderror.jsp</forward>  
  6.     </do>  
  7. </do-config>  

Dom4j读取xml文件代码如下:

[java] view plain copy print ?
  1. public static void readStringXml() {  
  2.         // Document doc = null;  
  3.         try {  
  4.             // 读取并解析XML文档  
  5.             // SAXReader就是一个管道,用一个流的方式,把xml文件读出来  
  6.             SAXReader reader = new SAXReader(); // User.hbm.xml表示你要解析的xml文档  
  7.             InputStream in = Thread.currentThread().getContextClassLoader()  
  8.                     .getResourceAsStream("NewFile.xml");  
  9.             Document doc = reader.read(in);  
  10.             Element rootElt = doc.getRootElement(); // 获取根节点  
  11.             System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称  
  12.   
  13.             for (int i = 0; i < rootElt.nodeCount(); i++) {  
  14.                 Node node = rootElt.node(i);  
  15.                 if (node instanceof Element) {  
  16.                     Element elementTemp = (Element) node;  
  17.                     System.out.println("二级节点do:" + node.getName()); // 拿到第一个二级节点的名称do  
  18.                     // 取得二级节点do的type和path属性的值  
  19.                     for (Iterator iter = elementTemp.attributeIterator(); iter  
  20.                             .hasNext();) {  
  21.                         Attribute item = (Attribute) iter.next();  
  22.                         System.out.println("二级节点do的:" + item.getName() + "为"  
  23.                                 + item.getValue()); // 拿到二级节点的path和type  
  24.                     }  
  25.                     // 获取二级节点的下面的子节点forward(三级节点)  
  26.                     for (Iterator iterroot2 = elementTemp.elementIterator(); iterroot2  
  27.                             .hasNext();) {  
  28.                         Element root22 = (Element) iterroot2.next(); // 得到一个二级节点  
  29.                         System.out.println("三级节点forward:" + root22.getName());  
  30.                         System.out.println("三级节点forward的值:" + root22.getText()); // 获取forward的值  
  31.                         List attrList = root22.attributes(); // 获取三级节点的属性  
  32.                         // 遍历获取三级节点的属性  
  33.                         for (Iterator iter = attrList.iterator(); iter  
  34.                                 .hasNext();) {  
  35.                             Attribute item = (Attribute) iter.next();  
  36.                             System.out.println("三级节点forward的属性:"  
  37.                                     + item.getName() + "为" + item.getValue());  
  38.                         }  
  39.                     }  
  40.                 }  
  41.             }  
  42.         } catch (DocumentException e) {  
  43.             e.printStackTrace();  
  44.   
  45.         } catch (Exception e) {  
  46.             e.printStackTrace();  
  47.         }  
  48.     }  

显示结果如下:

        Dom4j读取xml文件的api(应用程序编程接口)而log4J是用于日志控制的_第2张图片

思考:

        此方法利用迭代解决了当读取的xml文件中存在有相同节点名的问题,单独看这段读取xml文件的代码,在里面也看不到xml文件中的节点对象和属性了。但是也产生了新的问题,如果根节点下已经不再局限于它的子节点最多为三级,如果节点有四级、五级,乃至更多的时候,应该怎么办?如何解决这个问题呢?看第三个版本

第三版本:

XML

[html] view plain copy print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <do-config>  
  3.     <do path="User/adduser" type="UserPackage.UserServlet">  
  4.         <forward name="Success">AddSuccess.jsp</forward>  
  5.         <forward name="Error">Adderror.jsp</forward>  
  6.     </do>  
  7.      <do path="User/deluser" type="UserPackage.delUserServlet">  
  8.         <forward name="Error">  
  9.             <current>zhudan.jsp</current>  
  10.         </forward>  
  11.     </do>   
  12. </do-config>  

Dom4j读取XML代码如下:

[java] view plain copy print ?
  1. public static void readxml() {  
  2.         SAXReader reader = new SAXReader(); // User.hbm.xml表示你要解析的xml文档  
  3.         InputStream in = Thread.currentThread().getContextClassLoader()  
  4.                 .getResourceAsStream("NewFile.xml");  
  5.         try {  
  6.             Document doc = reader.read(in);  
  7.             Element root = doc.getRootElement(); // 获取根节点  
  8.             List<Element> list = new ArrayList<Element>();  
  9.             list.add(root);  
  10.             while (list != null) {  
  11.                 Element element = null;  
  12.                 Element ele = null;  
  13.   
  14.                 Iterator ite = list.iterator();  
  15.                 if (ite.hasNext()) {  
  16.                     ele = (Element) ite.next();  
  17.                     ite.remove();  
  18.                 }  
  19.                 if (ele != null) {  
  20.                     for (Iterator i = ele.elementIterator(); (i != null)  
  21.                             && (i.hasNext());) {  
  22.                         element = (Element) i.next();  
  23.                         list.add(element);  
  24.                         if (element != null) {  
  25.                             System.out.println(element.getName() + " : "  
  26.                                     + element.getPath() + " --"  
  27.                                     + element.getText());  
  28.                             for (Iterator iter = element.attributeIterator(); iter  
  29.                                     .hasNext();) {  
  30.                                 Attribute item = (Attribute) iter.next();  
  31.                                 System.out.println(item.getName() + "为"  
  32.                                         + item.getValue());  
  33.                             }  
  34.                         }  
  35.                     }  
  36.                 }  
  37.             }  
  38.         } catch (DocumentException e) {  
  39.   
  40.             e.printStackTrace();  
  41.         }  
  42.     }  

运行结果如下:

 Dom4j读取xml文件的api(应用程序编程接口)而log4J是用于日志控制的_第3张图片

思考:

       这个方法读取XML文件,我就不用担心我的xml文件的内容是什么,节点有多少,节点属性有多少,我只关心xml文件的名字。

总结:

       这三个版本的关于Dom4j读取xml文件的代码,其实也是我的一个思考过程,通过别人的引申来扩展自己,积极思考,会带来不一样的收获。



你可能感兴趣的:(Dom4j读取xml文件的api(应用程序编程接口)而log4J是用于日志控制的)