Dom4j解析xml文件

Dom4j是dom4j.org出品的一个开源XML解析包。Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。Hibernate也是用它来读写配置文件的。

一、DOM4j的下载  
dom4j-1.6.1.jar 下载:http://sourceforge.net/directory/os:windows/freshness:recently-updated/?q=dom4j  


二、利用dom4j创建一个内容如下的xml文件SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
                       "ibatis-3-config.dtd">
<configuration>
   <environments default="development">
      <environment id="MySQL">
         <transactionManager type="JDBC">123</transactionManager>
         <dataSource type="POOLED">
             <property name="driver" value="com.mysql.jdbc.Driver"/>
             <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
             <property name="username" value="root"/>
             <property name="password" value="admin"/>
         </dataSource>
      </environment>
   </environments>
   
   <mappers>
      <mapper resource="com/pojo/sql/DepMap.xml"/>
      <mapper resource="com/pojo/sql/EmpMap.xml"/>
   </mappers>
</configuration>


步骤:
 1.创建一个输出流,指定创建的SqlMapConfig.xml文件的位置-------OutputStream
    OutputStream os = new FileOutputStream("d:/SqlMapConfig.xml");
 2.创建一个xml编写器-------XMLWriter
    XMLWriter writer = new XMLWriter(os,OutputFormat.createPrettyPrint());
    这里os是前面新建的一个输出流,OutputFormat.createPrettyPrint()是指定输出的格式的,这里代表内容缩进。
 3.创建xml文档-------Document、DocumentHelper
    Document document = DocumentHelper.createDocument();
 4.创建里面的所有结点元素-------Elemenet
    Element configuration = document.addElement("configuration");
   ..............
    新建结点元素的形式是:Element 子结点 = 父节点.addElement("子结点名");
    给结点元素添加属性是:结点.addAttribute("属性名", "属性值");
 5.保存xml
    writer.write(document);
代码如下:

public class CreateXML {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        //创建一个输出流,指定创建的xml文件的位置
        OutputStream os = new FileOutputStream("d:/SqlMapConfig.xml");
        
        XMLWriter writer = new XMLWriter(os,OutputFormat.createPrettyPrint());
        
        //创建Document
        Document document = DocumentHelper.createDocument();
        
        Element configuration = document.addElement("configuration");
        
        Element environments = configuration.addElement("environments");
        environments.addAttribute("default", "development");
        
        Element environment = environments.addElement("environment");
        environment.addAttribute("id", "MySQL");
        Element transactionManager = environment.addElement("transactionManager");
        transactionManager.addAttribute("type", "JDBC");
        transactionManager.setText("123");
        
        Element dataSource = environment.addElement("dataSource");
        dataSource.addAttribute("type", "POOLED");
        Element driver = dataSource.addElement("property");
        driver.addAttribute("name", "driver");
        driver.addAttribute("value", "com.mysql.jdbc.Driver");
        Element url = dataSource.addElement("property");
        url.addAttribute("name", "url");
        url.addAttribute("value", "jdbc:mysql://127.0.0.1:3306/test");
        Element username = dataSource.addElement("property");
        username.addAttribute("name", "username");
        username.addAttribute("value", "root");
        Element password = dataSource.addElement("property");
        password.addAttribute("name", "password");
        password.addAttribute("value", "admin");
        
        Element mappers = configuration.addElement("mappers");
        Element mapper1 = mappers.addElement("mapper");
        mapper1.addAttribute("resource", "com/pojo/sql/DepMap.xml");
        Element mapper2 = mappers.addElement("mapper");
        mapper2.addAttribute("resource", "com/pojo/sql/EmpMap.xml");
        //保存xml
        writer.write(document);
        writer.close();
    }
}

二、查找xml文件的内容
    查找xml文件内容有两种情况,第一种就是查找出所有同名的结点元素然后遍历、第二种就是直接找到某个结点元素
    比如遍历SqlMapConfig.xml,将driver、url、username、password的值读取出来就有两种方法,代码如下
方法一:

public class GetNodes {

    /**方法一:
     * 遍历新建的xml,将driver、url、username、password的值读取出来
     * @param args
     * @throws IOException 
     * @throws DocumentException 
     */
    public static void main(String[] args) throws IOException, DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read("d:/SqlMapConfig.xml");
        List<Element> elements = document.selectNodes("/configuration/environments/environment/dataSource/property");
        String driver = "";
        String url = "";
        String username = "";
        String password = "";
        for (Element e : elements) {
            String name = e.attributeValue("name");
            String value = e.attributeValue("value");
            if("driver".equals(name)){
                driver = value;
            }else if("url".equals(name)){
                url = value;
            }else if("username".equals(name)){
                username = value;
            }else if("password".equals(name)){
                password = value;
            }
        }
        System.out.println("driver:"+driver+",url:"+url+",username:"+username+",password:"+password);
    }
}

这里List<Element> elements = document.selectNodes("/configuration/environments/environment/dataSource/property")是指将名为property的结点元素全部找出来,用一个List接收。
方法二:

public class GetNodes1 {

    /**方法二:
     * 将driver、url、username、password的值读取出来
     * @param args
     * @throws IOException 
     * @throws DocumentException 
     */
    public static void main(String[] args) throws IOException, DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read("d:/SqlMapConfig.xml");
        Element driverElement = (Element)document.selectSingleNode("/configuration/environments/environment/dataSource/property[@name='driver']");
        Element urlElement = (Element)document.selectSingleNode("/configuration/environments/environment/dataSource/property[@name='url']");
        Element usernameElement = (Element)document.selectSingleNode("/configuration/environments/environment/dataSource/property[@name='username']");
        Element passwordElement = (Element)document.selectSingleNode("/configuration/environments/environment/dataSource/property[@name='password']");
        String driver = driverElement.attributeValue("value");
        String url = urlElement.attributeValue("value");
        String username = usernameElement.attributeValue("value");
        String password = passwordElement.attributeValue("value");
        
        System.out.println("driver:"+driver+",url:"+url+",username:"+username+",password:"+password);
    }
}

这种方法就没有遍历了,就是直接将要查找的结点找出来,用selectSingleNode()函数。这里的[@name='driver']是指名找到哪一个property结点,相当于一个键值对,表示找有name="driver"属性的property结点。
形式为[@属性名='属性值']。


三、修改XML文件
    步骤:
    1.读取要修改的xml文件
    2.查找到要修改的结点
    3.保存
代码如下:

public class UpdateNode {

    /**
     * 修改密码为123456
     * @param args
     * @throws DocumentException 
     * @throws IOException 
     */
    public static void main(String[] args) throws DocumentException, IOException {
        //读取并修改
        SAXReader reader = new SAXReader();
        Document document = reader.read("d:/SqlMapConfig.xml");
        Element passwordElement = (Element)document.selectSingleNode("/configuration/environments/environment/dataSource/property[@name='password']");
        passwordElement.addAttribute("value", "123456");
        //保存
        OutputStream os = new FileOutputStream("d:/SqlMapConfig.xml");
        XMLWriter writer = new XMLWriter(os,OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
        os.close();
    }

}

四、删除XML文件的某个结点元素
  删除和修改一样,也是要先找到要删除的结点,然后删除之,最后保存修改过的文件。删除结点的形式为:父节点.remove(子节点);
代码如下:

public class DeleteNode {

    /**
     * 删除密码结点
     * @param args
     * @throws DocumentException 
     * @throws IOException 
     */
    public static void main(String[] args) throws DocumentException, IOException {
        //找到结点并删除
        SAXReader reader = new SAXReader();
        Document document = reader.read("d:/SqlMapConfig.xml");
        Element passwordElement = (Element) document.selectSingleNode("/configuration/environments/environment/dataSource/property[@name='password']");
        passwordElement.getParent().remove(passwordElement);
        
        //保存
        OutputStream os = new FileOutputStream("d:/SqlMapConfig.xml");
        XMLWriter writer = new XMLWriter(os,OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
        os.close();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值