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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值