天天看点

XML解析——Dom4j

1、Dom4j(Document Object Model for Java)

  1. 列表内容

    Dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术。

    Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。

    【优点】

    ①大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。

    ②支持XPath。

    ③有很好的性能。

    【缺点】

    ①大量使用了接口,API较为复杂。

2、解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:

①自己创建Document对象

Document doc=DocumentHelper.createDocument();

Element root=doc.addElement(“students”); //students是根节点

②读取XML文件获取Document对象

SAXReader reader=new SAXReader();

Document doc=reader.read(new File(“XML文件地址”));

③读取XML文本获取Document对象

String xml=”……“;

Document doc=reader.parseText(xml);

3、解析XML,取 2 中的一种方法先获取Document对象:

SAXReader reader=new SAXReader();

Document doc=reader.read(new File(“XML文件地址”));

Element root=doc.getRootElement();

一、开始遍历根节点下面的所有节点。listNodes(root);

public void listNodes(Element node){  
        System.out.println("当前节点的名称:" + node.getName());  
        //首先获取当前节点的所有属性节点  
        List<Attribute> list = node.attributes();  
        //遍历属性节点 ,输出属性
        for(Attribute attribute : list){  
            System.out.println("属性"+attribute.getName() +":" + attribute.getValue());  
        }  
        //如果当前节点内容不为空,则输出  
        if(!(node.getTextTrim().equals(""))){  
             System.out.println( node.getName() + ":" + node.getText());    
        }  
        //同时迭代当前节点下面的所有子节点,获得Iterator对象
        //使用递归  
        Iterator<Element> iterator = node.elementIterator();  
        while(iterator.hasNext()){  
            Element e = iterator.next();  
            listNodes(e);  
        }  
    }  
           

二、Dom4j操作节点属性

使用dom4j可以操作节点属性,比如添加节点属性、删除节点属性、修改属性值等操作。下面使用dom4j为上述的student1节点删除id属性,新添name属性。

public void test2()throws Exception{  
        //创建SAXReader对象  
        SAXReader reader = new SAXReader();  
        //读取文件 转换成Document  
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
        //获取根节点元素对象  
        Element root = document.getRootElement();  

        System.out.println("-------添加属性前------");  
        //获取节点  第一个  student节点
        Element student1Element = root.element("student");  
        //遍历  
        listNodes(student1Element);  
        //获取其属性  
         //root.element("student").elementText("id"); 也可以获得id值
        Attribute idAttribute = student1Element.attribute("id");  
        //删除其属性  
        student1Element.remove(idAttribute);  
        //为其添加新属性  
        student1Element.addAttribute("name", "这是student1节点的新属性");  
        System.out.println("-------添加属性后------");  
        listNodes(student1Element);  
    }  
           

三、Dom4j新增节点,使用Dom4j可以删除指定节点、新增节点等操作。

public void test3()throws Exception{  
        //创建SAXReader对象  
        SAXReader reader = new SAXReader();  
        //读取文件 转换成Document  
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
        //获取根节点元素对象  
        Element root = document.getRootElement();  
        System.out.println("-------添加节点前------");  
        //获取第一个 student   节点
        Element student1Element = root.element("student");  
        //添加phone节点 ,在student1Element父节点 下面增加
        Element phoneElement = student1Element.addElement("phone");  
        //为phone节点设置值  
        phoneElement.setText("137xxxxxxxx");  
        //把student1Element写入新文件,或是覆盖之前的文件(现在的改变只是内存上的)  
        writerDocumentToNewFile(document);  
           

同样,删除节点先获得父节点,在通过父节点删除

public static void remove(Document doc,String address) throws Exception{
        //得到想要删除的节点
        Element remove = doc.getRootElement().element("student");
        //删除节点时先得到父亲节点,再删除
        remove.getParent().remove(remove);
        //写入硬盘。
        writeToFile(doc,address);
    }
           

四、从内存写入硬盘上。

public static void writerDocumentToNewFile(document) throws Exception {
        //良好的输出格式
         OutputFormat format = OutputFormat.createPrettyPrint();
         //紧凑的输出格式,内容挤在一行
         //format = OutputFormat.createCompactFormat();
         //写出到address(XML文件的地址),设置输出文件格式 和字符编码"UTF-8"
        XMLWriter writer = new XMLWriter(
        new OutputStreamWriter(new FileOutputStream(new File(address)),"UTF-8"),format);
        writer.write(document);
        writer.close();
    }