zoukankan      html  css  js  c++  java
  • dom4j操作xml

     目前接触到的关于xml的主要有方面:

      1、xml作为项目的配置文件,项目初始化时读取里边的内容。从系统方面考虑,在项目不重启的情况下要有修改重新载入配置的功能,此时需要对xml内容进行操作,

           如果是一个大系统需要各个系统之间进行通信,通知各个服务器进行重新载入。

      2、通信时传递的报文为xml格式,常见于webservice,此时接收或者传递报文时需要和bean相互转换。

      第一种情况,最流行的是dom4j,使用方便,代码简练,不用再封装工具类,性能最好。

      第二种情况,可以使用jaxb解析,封装一个工具类就可以实现xml与bean的相互转化。

      这里写一下dom4j的使用,jaxb使用方法请点击  jaxb实现xml与bean的相互转化 。

     ①  test.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <orgs size="7095" batch_number="20130704110039" errmsg="错误信息">
        <org>
            <org_id>16817</org_id>
            <parent_id>9233</parent_id>
            <org_name>512AAS.苏州沧浪区</org_name>
            <org_code>512AAS</org_code>
            <org_type>门店部门1</org_type>
            <start_d>2011-12-28</start_d>
            <end_d>2011-12-29</end_d>
            <attribute1></attribute1>
            <insert_t>2013-7-4 10:32:09</insert_t>
        </org>
        <org>
            <org_id>16818</org_id>
            <parent_id>9234</parent_id>
            <org_name>513AAS.苏州沧浪区</org_name>
            <org_code>513AAS</org_code>
            <org_type>门店部门2</org_type>
            <start_d>2011-12-18</start_d>
            <end_d>2011-12-19</end_d>
            <attribute1></attribute1>
            <insert_t>2013-7-5 10:32:09</insert_t>
        </org>
        <org>
            <org_id>16819</org_id>
            <parent_id>9235</parent_id>
            <org_name>514AAS.苏州沧浪区</org_name>
            <org_code>514AAS</org_code>
            <org_type>门店部门3</org_type>
            <start_d>2011-12-08</start_d>
            <end_d>2011-12-09</end_d>
            <attribute1></attribute1>
            <insert_t>2013-7-6 10:32:09</insert_t>
        </org>
    </orgs>
    /**
     * dom4j的代码已经很简单易懂了,不需要自己再封装工具类了 
     * DOM4J是 dom4j.org 出品的一个开源 XML 解析包。
     * DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。
     * @author cxz
     */
    public class dom4j {
        public static void main(String[] args) {
            try {   
                //手动创建
                Document document = DocumentHelper.createDocument();//创建doc对象  
                Element roott = document.addElement("csdn");//创建csdn根节点
                
                //读取xml文件为doc对象
                String path = "D:\test.xml";
                File file = new File(path);
                SAXReader reader = new SAXReader();                
                Document doc = reader.read(file);   
                
                //将整个xml转换为string
                String testxml = doc.asXML();
                
                //将String转换为doc对象
                doc = DocumentHelper.parseText(testxml);
                
                //读取根节点
                Element root = doc.getRootElement(); 
                
                //读取此节点下的子节点
                Element org=root.element("org");
                Element orgId = org.element("org_id");
                //没有子节点的节点才能读取到text
                String s = orgId.getText();
                System.out.println(s);
                
                //读取某节点下所有的名字为**的子节点,遍历
                List<Element> nodes = root.elements("org");
                for(Element e : nodes){
                    Element orgid = e.element("org_id");
                    System.out.println(orgid.getText());
                }
                
                //读取某节点下的所有子节点
                List<Element> es = root.elements();//得到5个orgs
                
                //在某节点下添加子节点  
                Element elm = root.addElement("朝代");  
                //设置节点文字
                elm.setText("明朝");  
                //删除某节点
                //childElement是待删除的节点,parentElement是其父节点  
                root.remove(org);
                //添加一个CDATA节点
                Element contentElm = root.addElement("content");
                contentElm.addCDATA("cdata区域");  
    
                //获取节点属性
                Attribute attribute=root.attribute("batch_number"); 
                String batch_number = attribute.getText();
                
                //删除某属性
                Attribute attribute1=root.attribute("errmsg");
                root.remove(attribute1);  
                
                //遍历节点属性值 
                for(Iterator it=root.attributeIterator();it.hasNext();){        
                       Attribute attribute2 = (Attribute) it.next();          
                       String text=attribute2.getText();        
                       System.out.println(text);
                }  
                
                //写入xml            
                //无中文
                XMLWriter writer = new XMLWriter(new  FileWriter("ot.xml"));  
                writer.write(document); 
                writer.close(); 
                
                //有中文
                // 紧凑的格式  
    //            OutputFormat format = OutputFormat.createCompactFormat();  
                // 缩紧格式
                OutputFormat format = OutputFormat.createPrettyPrint();// 创建文件输出的时候,自动缩进的格式                    
                format.setEncoding("UTF-8");//设置编码  
    //            XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);  
                XMLWriter xmlwriter = new XMLWriter(new OutputStreamWriter(  
                        new FileOutputStream(new File("src//a.xml")), "UTF-8"), format);
                xmlwriter.write(document);  
                xmlwriter.flush();
                xmlwriter.close();             
            } catch (Exception e) {   
                e.printStackTrace();   
            }   
        }
    }

    项目中的实际运用,项目启动类中的初始化xml

    这里有一个获取jar包路径的工具类,如下:

    /**
     * 路径通用类
     * @author 李冬
     * 说明:
     */
    public class JarUtil {
        private String jarName;
        private String jarPath;
    
        public JarUtil(Class<?> clazz) {
            //获这个文件到他的bin路径
            String path = clazz.getProtectionDomain().getCodeSource().getLocation().getFile();
        
            try {
                path = java.net.URLDecoder.decode(path, "UTF-8");
                
            } catch (java.io.UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            java.io.File jarFile = new java.io.File(path);
            this.jarName = jarFile.getName();
    
            java.io.File parent = jarFile.getParentFile();
            if (parent != null) {
                this.jarPath = parent.getAbsolutePath();
            }
        }
    
        /**
         * 获取Class类所在Jar包的名称
         * 
         * @return Jar包名 (例如:C:	empdemo.jar 则返回 demo.jar )
         */
        public String getJarName() {
            try {
                
                return java.net.URLDecoder.decode(this.jarName, "UTF-8");
            } catch (java.io.UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 取得Class类所在的Jar包路径
         * 
         * @return 返回一个路径 (例如:C:	empdemo.jar 则返回 C:	emp )
         */
        public String getJarPath() {
            try {
                return java.net.URLDecoder.decode(this.jarPath, "UTF-8");
            } catch (java.io.UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static void main(String[] args) throws Exception {
            JarUtil ju = new JarUtil(JarUtil.class);
            System.out.println("Jar name: " + ju.getJarName());
            System.out.println("Jar path: " + ju.getJarPath());
        }
    }
    public void initConf() throws Exception {
            logger.info(">>>配置系统信息...开始读取配置文件setting.xml");        
            JarUtil pathUtil = new JarUtil(this.getClass());
            String path = pathUtil.getJarPath();
            File url = new File(path + File.separator + "setting.xml");
            Element root = null;
            Document doc = null;
            SAXReader xmlReader = new SAXReader();
            try {
                doc = xmlReader.read(url);
            } catch (Exception ex) {
                logger.info("setting.xml" + "不是合法的配置文件", ex);
                throw ex;
            }
    
            logger.info(">>>配置系统信息...读取配置文件setting.xml完毕....开始分析配置文件信息");
            root = doc.getRootElement();
                    ......
    }

    来波链接

            Java解析xml的四种经典方法    详解Java解析XML的四种方法—DOM/SAX/jdom/dom4j   XML解析——Java中XML的四种解析方式

            使用JDOM操作XML    Dom4j完整教程

  • 相关阅读:
    Docker入门之二镜像
    巧用Freemarker的自定义方法
    freemarker空值的多种处理方法
    ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别
    Mingyang.net:自定义FreeMarkerView
    hibernate one-to-many many-to-one 双向注解
    Mingyang.net:Controller必需是public吗?
    Mingyang.net:org.springframework.context.annotation.ConflictingBeanDefinitionException
    Mingyang.net:No identifier specified for entity
    jQuery:find()及children()的区别
  • 原文地址:https://www.cnblogs.com/xinzhisoft/p/10134711.html
Copyright © 2011-2022 走看看