XML学习06-Java中Dom4J方式解析XML文件

一、什么Dom4J方式

Dom4j是一个简单、灵活的开放源代码的库,是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate。

二、Java中使用Dom4J方式的准备工作

由于Dom4J并不是JDK中的API,需要自己到网络上下载相应的jar包,并且在需要使用Dom4J的项目中添加。

三、具体的Java代码实现
在java中用Dom4JAPI实现以下七种常见操作:(注释中解释具体操作)
0、创建解析器,得到Document对象、将修改结果输出到源文件
1、得到某个具体的节点内容
2、遍历所有元素节点
3、修改某个元素节点的主体内容
4、向指定元素节点中增加子元素节点
5、向指定元素节点上增加同级元素节点
6、删除指定元素节点
7、操作XML文件属性

待解析的XML文档内容:

<联系人列表> 
  <联系人> 
    <姓名>张三</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年龄>30</年龄> 
  </联系人>  
  <联系人> 
    <姓名>李四</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年龄>31</年龄>
  </联系人> 
</联系人列表>

0、创建解析器,得到Document对象、将修改结果输出到源文件

//创建Dom4j解析器
SAXReader reader = new SAXReader();
//加载document对象
Document document = reader.read("src/j2ee/dom/linkman.xml");
//将结果保存到硬盘上
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"), OutputFormat.createPrettyPrint());//参数:文件输出流(目标文件),输出格式(有两种,一般选用PrettyPrint格式)
writer.write(document);
writer.close();

1、得到某个具体的节点内容(获取第二个联系人姓名,输出结果为李四)

public static void test01(Document document) {
        //拿到根节点
        Element root = document.getRootElement();
        //拿到所有的联系人
        List<Element> men = root.elements();
        //拿到第二个联系人
        Element man = men.get(1);
        //打印第二个联系人的姓名
        System.out.println(man.elementText("姓名"));
    }

2、遍历所有元素节点

public static void treeWalk(Document document) {
        //从根节点开始遍历
        treeWalk( document.getRootElement() );
    }
    public static void treeWalk(Element element) {
        for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
            //循环拿到当前节点下的每一个子节点
            Node node = element.node(i);
            //如果当前拿到的节点时一个元素,则输出元素名,且递归调用遍历方法遍历当前元素的子节点
            if ( node instanceof Element ) {
                System.out.println(node.getName());
                treeWalk((Element) node);
            }
        }
    }

输出结果:(将XML文档中的元素标签名按顺序输出)

联系人
姓名
EMAIL
年龄
联系人
姓名
EMAIL
年龄

3、修改某个元素节点的主体内容

 /**
     * 3、修改某个元素节点的主体内容 (李四年龄改为27)
     */
public static void test03(Document document) throws IOException {
       //拿到根节点
       Element root = document.getRootElement();
       //拿到根节点下所有元素
       List<Element> men = root.elements();
       //拿到第二个联系人李四
       Element man = men.get(1);
       //拿到李四的年龄节点
       Element name = man.element("年龄");
       //将李四的年龄改为27
       name.setText("27");
       //将结果保存到硬盘上
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"), OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }

查看源文件发现联系人李四的年龄变为27

4、向指定元素节点中增加子元素节点

/**
     * 4、向指定元素节点中增加子元素节点(张三姓名内添加暱称)
     */
    public static void test04(Document document) throws IOException {
        Element root = document.getRootElement();
        List<Element> men = root.elements();
        Element man = men.get(0);
        //拿到第一个联系人的姓名节点
        Element name = man.element("姓名");
        //在姓名节点内添加元素"暱称"内容为"三哥"
        name.addElement("暱称").setText("三哥");
        //将结果保存到硬盘上
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }

查看源文件:(张三姓名下多了暱称节点,李四年龄在3操作时被修改)

<联系人列表> 
  <联系人> 
    <姓名>张三
      <暱称>三哥</暱称>
    </姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年龄>30</年龄> 
  </联系人>  
  <联系人> 
    <姓名>李四</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年龄>27</年龄> 
  </联系人> 
</联系人列表>

5、向指定元素节点上增加同级元素节点

 /**
     * 5、向指定元素节点上增加同级元素节点(给李四年龄节点增加同级别节点婚否)
     */
    public static void test05(Document document) throws IOException {
        Element root = document.getRootElement();
        List<Element> men = root.elements();
        Element man = men.get(1);
        //得到李四年龄节点
        Element age = man.element("年龄");
        //添加年龄节点的同级别节点"婚否",内容为"已婚"
        age.getParent().addElement("婚否").setText("已婚");
        //将结果保存到硬盘
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }

查看源文件:

<联系人列表> 
  <联系人> 
    <姓名>张三 
      <暱称>三哥</暱称> 
    </姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年龄>30</年龄> 
  </联系人>  
  <联系人> 
    <姓名>李四</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年龄>27</年龄>  
    <婚否>已婚</婚否>
  </联系人> 
</联系人列表>

6、删除指定元素节点

 /**
     * 6、删除指定元素节点(删除张三暱称)
     */
    public static void test06(Document document) throws IOException {
        Element root = document.getRootElement();
        List<Element> men = root.elements();
        Element man = men.get(0);
        Element name = man.element("姓名");
        Element nickname = name.element("暱称");
        //删除了name元素(姓名)的子元素nickname(暱称)
        name.remove(nickname);

        XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }

查看源文件:(暱称节点已经被删除)

<联系人列表> 
  <联系人> 
    <姓名>张三</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年龄>30</年龄> 
  </联系人>  
  <联系人> 
    <姓名>李四</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年龄>27</年龄>  
    <婚否>已婚</婚否> 
  </联系人> 
</联系人列表>

7、操作XML文件属性

/**
     * 7、操作XML文件属性(联系人添加性别)
     */
    public static void test07(Document document) throws IOException {
        Element root = document.getRootElement();
        List<Element> men = root.elements();
        //遍历所有联系人
        for (Element man: men) {
            //给每个联系人添加属性"性别",内容为"男"
           man.addAttribute("性别","男");
        }
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }

查看源文件:(性别属性被添加到联系人标签内)

<联系人列表> 
  <联系人 性别="男"> 
    <姓名>张三</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年龄>30</年龄> 
  </联系人>  
  <联系人 性别="男"> 
    <姓名>李四</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年龄>27</年龄>  
    <婚否>已婚</婚否> 
  </联系人> 
</联系人列表>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章