使用Dom4j解析XML


对xml文件进行删除,添加操作,以至于达到更新节点目的;


import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
/**
        <?xml version="1.0" encoding="UTF-8"?>  
        <四大名著>  
            <西游记 id="x001">  
                <作者>吴承恩1</作者>  
                <作者>吴承恩2</作者>  
                <朝代>明朝</朝代>  
            </西游记>  
            <红楼梦 id="x002">  
                <作者>曹雪芹</作者>  
            </红楼梦>  
        </四大名著>  
 *
 *
 * @author MY
 *
 */
public class Demo4jDemo {
    @Test  
    public void test1() throws Exception{
        String file="conf/demo/sida.xml";
        String code="utf-8";
        // 创建saxReader对象  
        SAXReader reader = new SAXReader();  
        // 通过read方法读取一个文件 转换成Document对象  
        Document document = reader.read(new File(file));  
        //获取根节点元素对象  
        Element node = document.getRootElement();  
        //        updateElementNode(node,"红楼梦","三国","id","123","作者","徐良");
        //        updateElementNode(node,"红楼梦","作者","作者","徐良");
        //        updateElementAttr(node,"红楼梦","id","a","v");
        //        listNodes(node);
        elementMethod(node,"西游记");
        elementMethod(node,"西游记","作者",false);
        writer(document,file,code);  
    }





    /**
     * 更新节点  删除红楼梦,添加三国
        updateElementNode(node,"红楼梦","三国","id","123","作者","徐良");
             <四大名著>
              <西游记 id="x001">
                <作者>吴承恩1</作者>  
                <作者>吴承恩2</作者>  
                <朝代>明朝</朝代>
              </西游记>  
              <三国 id="123">
                <作者>徐良</作者>
              </三国>
            </四大名著>
     */
    public void updateElementNode(Element node,String name,String p2name,String p2attrid,String p2attrname,String nodeName,String nodeText){
        Element element = node.element(name);
        //删除元素节点  
        boolean flag = node.remove(element);  
        Element p2=null;
        if("".equals(p2attrid) || p2attrid==null){
            p2=node.addElement(p2name);
        }else{
            p2=node.addElement(p2name).addAttribute(p2attrid,p2attrname);
        }
        Element newElement = p2.addElement(nodeName);  
        newElement.setText(nodeText);  
    }

    /**
     * 更新节点  把红楼梦的作者改为徐良
     * updateElementNode(node,"红楼梦","作者","作者","徐良");
        <四大名著>
          <西游记 id="x001">
            <作者>吴承恩1</作者>  
            <作者>吴承恩2</作者>  
            <朝代>明朝</朝代>
          </西游记>  
          <红楼梦 id="x002">
            <作者>徐良</作者>
          </红楼梦>
        </四大名著>
     */
    public void updateElementNode(Element node,String name,String p2name,String nodeName,String nodeText){
        Element element = node.element(name);
        Element p2node =element.element(p2name);
        //删除元素节点  
        boolean flag = element.remove(p2node);  
        Element newElement = element.addElement(nodeName);  
        newElement.setText(nodeText);  
    }

    /**
     * 对节点的属性更新
     * updateElementAttr(node,"红楼梦","id","a","v");
         <四大名著>
          <西游记 id="x001">
            <作者>吴承恩1</作者>  
            <作者>吴承恩2</作者>  
            <朝代>明朝</朝代>
          </西游记>  
          <红楼梦 a="v">
            <作者>曹雪芹</作者>
          </红楼梦>
        </四大名著>
     */
    public void updateElementAttr(Element node,String name,String id,String attrid,String attrname){
        Element element = node.element(name);  
        //获取element的id属性节点对象  
        Attribute attr = element.attribute(id);  
        //删除属性  
        element.remove(attr);  
        //添加新的属性  
        element.addAttribute(attrid, attrname);  
    }



    /**
     * 把document对象写入新的文件
     *  
     * @param document
     * @throws Exception
     */  
    public void writer(Document document,String file,String code) throws Exception {
        // 紧凑的格式  
        // OutputFormat format = OutputFormat.createCompactFormat();  
        // 排版缩进的格式  
        OutputFormat format = OutputFormat.createPrettyPrint();  
        // 设置编码  
        format.setEncoding(code);  
        // 创建XMLWriter对象,指定了写出文件及编码格式  
        // XMLWriter writer = new XMLWriter(new FileWriter(new  File("src//a.xml")),format);  
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File(file)),code), format);  
        // 写入  
        writer.write(document);  
        // 立即写入  
        writer.flush();  
        // 关闭操作  
        writer.close();  
    }  

    /**
     * 遍历当前节点元素下面的所有(元素的)子节点
     *  
     * @param node
     */  
    public void listNodes(Element node) {  
        System.out.println("当前节点的名称::" + node.getName());  
        // 获取当前节点的所有属性节点  
        List<Attribute> list = node.attributes();  
        // 遍历属性节点  
        for (Attribute attr : list) {  
            System.out.println(attr.getText() + "-----" + attr.getName()   + "---" + attr.getValue());  
        }  

        if (!(node.getTextTrim().equals(""))) {  
            System.out.println("文本内容::::" + node.getText());  
        }  

        // 当前节点下面子节点迭代器  
        Iterator<Element> it = node.elementIterator();  
        // 遍历  
        while (it.hasNext()) {  
            // 获取某个子节点对象  
            Element e = it.next();  
            // 对子节点进行遍历  
            listNodes(e);  
        }  
    }  

    /**
     * 获取根节点下面的name的所有子节点
     * elementMethod(node,"西游记");
     *
     */  
    public Map<String ,List> elementMethod(Element node,String name) {
        Map<String ,List> map=new HashMap<String,List>();
        Element e = node.element(name);  
        // 获取西游记这个元素节点 所有元素的子节点。  
        List<Element> elements = e.elements();
        map.put(name, elements);
        for (Element el : elements) {  
            System.out.println(el.getText());  
        }  
        return map;
    }  

    /**
     * elementMethod(node,"西游记","作者",false);
     * @param node
     * @param name
     * @param elementName
     * @param flag
     * @return
     */
    public Map elementMethod(Element node,String name,String elementName,boolean flag) {  
        Map<String ,Object> map=new HashMap<String,Object>();
        Element e = node.element(name);  
        if(flag){  //选中第一个
            Element author = e.element(elementName);  
            map.put(elementName, author);
            System.out.println(e.getName() + "----" + author.getText());  
        }else{ // 获取name这个元素节点 中,所有子节点名称为elementName元素的节点 。  
            List<Element> authors = e.elements(elementName);  
            map.put(elementName, authors);
            for (Element aut : authors) {  
                System.out.println(aut.getText());  
            }  
        }
        return map;
    }  

}







字符串与XML互转换案例


import java.io.File;  
import java.io.FileOutputStream;  
import java.io.OutputStreamWriter;  
 
import org.dom4j.Document;  
import org.dom4j.DocumentHelper;  
import org.dom4j.Element;  
import org.dom4j.io.OutputFormat;  
import org.dom4j.io.SAXReader;  
import org.dom4j.io.XMLWriter;  
import org.junit.Test;  
/**
 * 字符串与XML互转换案例
 * @author MY
 *
 */
public class Demo4jDemo2 {

    public Demo4jDemo2() {
        // TODO Auto-generated constructor stub
    }

//    @Test  
    public void test() throws Exception {  
 
        // 创建saxreader对象  
        SAXReader reader = new SAXReader();  
        // 读取一个文件,把这个文件转换成Document对象  
        Document document = reader.read(new File("conf/demo/a.xml"));  
        // 获取根元素  
        Element root = document.getRootElement();  
        // 把文档转换字符串  
        String docXmlText = document.asXML();  
        System.out.println(docXmlText);  
        System.out.println("---------------------------");  
        // csdn元素标签根转换的内容  
        String rootXmlText = root.asXML();  
        System.out.println(rootXmlText);  
        System.out.println("---------------------------");  
        // 获取java元素标签 内的内容  
        Element e = root.element("西游记");  
        System.out.println(e.asXML());  
 
    }  
 
    /**
     * 创建一个document对象 往document对象中添加节点元素 转存为xml文件
     *  
     * @throws Exception
     */
//    @Test  
    public void test2() throws Exception {  
        Document document = DocumentHelper.createDocument();// 创建根节点  
        Element root = document.addElement("csdn");  
        Element java = root.addElement("java");  
        java.setText("java班");  
        Element ios = root.addElement("ios");  
        ios.setText("ios班");  
        writer(document);  
    }  
 
    /**
     * 把一个文本字符串转换Document对象
     *  
     * @throws Exception
     */  
//    @Test   
    public void test1() throws Exception {  
        String text = "<csdn><java>Java班</java><net>Net班</net></csdn>";  
        Document document = DocumentHelper.parseText(text);  
        Element e = document.getRootElement();  
        System.out.println(e.getName());  
        writer(document);  
    }  
 
    /**
     * 把document对象写入新的文件
     *  
     * @param document
     * @throws Exception
     */
    public void writer(Document document) throws Exception {  
        // 紧凑的格式  
        // OutputFormat format = OutputFormat.createCompactFormat();  
        // 排版缩进的格式  
        OutputFormat format = OutputFormat.createPrettyPrint();  
        // 设置编码  
        format.setEncoding("UTF-8");  
        // 创建XMLWriter对象,指定了写出文件及编码格式  
        // XMLWriter writer = new XMLWriter(new FileWriter(new File("src//a.xml")),format);  
        XMLWriter writer = new XMLWriter(new OutputStreamWriter( new FileOutputStream(new File("conf/demo/a.xml")), "UTF-8"), format);  
        // 写入  
        writer.write(document);  
        // 立即写入  
        writer.flush();  
        // 关闭操作  
        writer.close();  
    }  
}



你可能感兴趣的:(使用Dom4j解析XML)