java解析xml

Posted xinzhiSoft

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java解析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:\\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完整教程

以上是关于java解析xml的主要内容,如果未能解决你的问题,请参考以下文章

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

在java中解析xml有哪几种方法

为 Blogger 上的博客格式化代码片段 [关闭]

java解析xml的几种方式哪种最好?

片段(Java) | 机试题+算法思路+考点+代码解析 2023

无法解析片段中的 findViewById [重复]