zoukankan      html  css  js  c++  java
  • dom4j 操作总结

    在官网https://dom4j.github.io/下载最新的dom4j的jar包,以及配合xpath解析的http://central.maven.org/maven2/jaxen/jaxen/1.1.6/的jaxen.jar包。

    总的来说其实要掌握的是,node和element和attribute的使用,以及一些迭代器配合。下面展示示例代码。具体演示了xml的增删改查的操作。

    package Day04;
    
    import java.io.FileOutputStream;
    import java.io.OutputStreamWriter;
    import java.util.Iterator;
    import java.util.List;
    
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    import org.junit.Test;
    
    public class XmlDemo {
        private void documentToFile(Document doucument,String charsetName) throws Exception {
            FileOutputStream fileWiter = new FileOutputStream("src/book.xml");
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(new OutputStreamWriter(fileWiter,charsetName), format);
            writer.write( doucument );
            writer.close();
        }
        @Test
        public void CreateXml() {
            Document document = DocumentHelper.createDocument();
            Element root = document.addElement("书店");
            Element cateGrayElement1 =  root.addElement("分类").addAttribute("descript", "童话故事");
            Element cateGrayElement2 =  root.addElement("分类").addAttribute("descript", "IT技术刊");
            
            Element bookElement1 = cateGrayElement1.addElement("书");
            bookElement1.addElement("书名").addText("格林童话");
            bookElement1.addElement("国家").addText("非中");
            Element bookElement2 = cateGrayElement1.addElement("书");
            bookElement2.addElement("书名").addText("愚公移山");
            bookElement2.addElement("国家").addText("中国");
            Element bookElement3 = cateGrayElement2.addElement("书");
            bookElement3.addElement("书名").addText("Tcp/ip 详解");
            bookElement3.addElement("国家").addText("非中");
            Element bookElement4 = cateGrayElement2.addElement("书");
            bookElement4.addElement("书名").addText("c语言入门");
            bookElement4.addElement("国家").addText("中国");
            try {
                documentToFile(document,"UTF-8");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public void treeWalk(Document document) {
            treeWalk(document.getRootElement());
        }
    
        public void treeWalk(Element element) {
            for (int i = 0, size = element.nodeCount(); i < size; i++) {
                Node node = element.node(i);
                if (node instanceof Element) {
                    String name = node.getName();
                    switch(name) {
                        case "分类":System.out.println(name+"(descript="+((Element) node).attributeValue("descript")+")");break;
                        case "书":System.out.println("	"+name);break;
                        default:System.out.println("		"+name+" "+node.getText());
                    }
                    treeWalk((Element) node);
                }
                else {
                    // do something…
                }
            }
        }
        /*
         * 递归输出xml
         */
        @Test
        public void loopXml() throws Exception {
             SAXReader reader = new SAXReader();
             Document document = reader.read("src/book.xml");
             treeWalk(document);
        }
        
        
        /**
         * 利用xpath语法 获取属性和节点
         */
        @Test
        public void xpath() throws Exception {
             SAXReader reader = new SAXReader();
             Document document = reader.read("src/book.xml");
             System.out.println("----------------------获取属性---------------------------------");
             List<Node> attrlists = document.selectNodes("//@descript");
             Iterator<Node> attrIt = attrlists.iterator();
             while(attrIt.hasNext()) {
                 Attribute attr = (Attribute)attrIt.next();
                 System.out.println("分类的"+(attr).getName()+"="+attr.getData());
             }
             System.out.println("----------------------获取节点---------------------------------");
             List<Node> lists = document.selectNodes("//书");
             Iterator<Node> it = lists.iterator();
             while(it.hasNext()) {
                 //获取子类值
                 Node node = it.next();
                 for (Iterator<Element> bookIt = ((Element)node).elementIterator(); bookIt.hasNext();) {
                        Element element = bookIt.next();
                        System.out.println(element.getName()+":"+element.getText());
                        // do something
                 }
             }
             
             System.out.println("-----------------------获取属性的节点--------------------------------");
             List<Node> attrlists1 = document.selectNodes("//分类[@descript="童话故事"]");
             Iterator<Node> attrIt1 = attrlists1.iterator();
             while(attrIt1.hasNext()) {
                 //获取子类值
                 Element cateElement = (Element)attrIt1.next();
                 System.out.println(cateElement.getName()+"attributes:descript="+cateElement.attribute("descript").getValue());
             }
        }
        
        /**
         * 演示插入,在愚公移山书名后加一个简介(指定位置插入)
         */
        @Test
        public void insert() throws Exception {
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            //找到第二本书//分类[@descript="童话故事"]/书[2]
            Node pNode = document.selectSingleNode("//分类[@descript="童话故事"]/书[2]");
            List<Element> list = ((Element)pNode).elements();
            Element addNode = DocumentHelper.createElement("简介");
            addNode.addText("《愚公移山》是战国时期思想家列子创作的一篇寓言小品文。文章叙述了愚公不畏艰难,坚持不懈,挖山不止,最终感动天帝而将山挪走的故事。");
            list.add(1, addNode);
            System.out.println(list.toArray());
            try {
                documentToFile(document,"UTF-8");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        /**
         * 修改xml元素
         */
        @Test
        public void update() throws Exception {
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            //找到要修改的节点,比如我现在想给愚公移山这个书名加上书名号
            Node pNode = document.selectSingleNode("//分类[@descript="童话故事"]/书[2]/书名");
            pNode.setText(new StringBuffer().append("《").append(pNode.getText()).append("》").toString());
            try {
                documentToFile(document,"UTF-8");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        /**
         * 删除,刚刚添加的愚公移山的简介
         */
        @Test
        public void delete() throws Exception {
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            //找到要修改的节点,比如我现在想给愚公移山这个书名加上书名号
            Node pNode = document.selectSingleNode("//分类[@descript="童话故事"]/书[2]/简介");
            ((Element)pNode).getParent().remove(pNode);
            try {
                documentToFile(document,"UTF-8");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } 
    }
  • 相关阅读:
    os 模块删除图片操作
    python base64基本使用
    django 跨域
    git 回滚
    多线程
    原生sql子查询 和psql 子查询
    Python 3.x 中"HTTP Error 403: Forbidden"问题的解决方案
    报错(AttributeError: 'str' object has no attribute 'items')的解决办法
    C++虚函数
    C++泛型程序设计和多态
  • 原文地址:https://www.cnblogs.com/gavinjunftd/p/9354553.html
Copyright © 2011-2022 走看看