dom4j操做xml

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

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

       若是是一个大系统须要各个系统之间进行通讯,通知各个服务器进行从新载入。node

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

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

  第二种状况,能够使用jaxb解析,封装一个工具类就能够实现xml与bean的相互转化。框架

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

 ①  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();   
        }   
    }
}

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

这里有一个获取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:\temp\demo.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:\temp\demo.jar 则返回 C:\temp )
     */
    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完整教程

相关文章
相关标签/搜索