使用Dom4j解析XML文档

来源:互联网 发布:最受欢迎的网络歌手 编辑:程序博客网 时间:2024/05/22 04:47

使用Dom4j解析XML文档

--尚晓鹏

Dom4j是一个易用的、开源的库,用于XMLXPathXSLT。它应用于Java平台,采用了Java集合框架并完全支持DOMSAXJAXP

下面我们一起来分析一下使用Dom4j对于XML文档的CRUD操作。

Dom4j的主要接口(org.dom4j

Attribute

Attribute定义了XML的属性

Branch

Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为

CDATA

CDATA 定义了XML CDATA 区域

CharacterData

CharacterData是一个标识借口,标识基于字符的节点。如CDATAComment, Text

Comment

Comment 定义了XML注释的行为

Document

定义了XML文档

DocumentType

DocumentType 定义XML DOCTYPE声明

Element

Element定义XML 元素

ElementHandler

ElementHandler定义了 Element 对象的处理器

ElementPath

ElementHandler 使用,用于取得当前正在处理的路径层次信息

Entity

Entity定义 XML entity

Node

Node为所有的dom4jXML节点定义了多态行为

NodeFilter

NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate

ProcessingInstruction

ProcessingInstruction 定义 XML 处理指令

Text

Text 定义XML 文本节点

Visitor

Visitor 用于实现Visitor模式

XPath

XPath 在分析一个字符串后会提供一个XPath 表达式

一、            读取并解析XML文档

import java.io.File;

import java.io.FileWriter;

import java.util.Iterator;

import java.util.List;

import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.SAXReader;

import org.dom4j.io.XMLWriter;

import org.junit.Test;

public class Dom4jDeom {

   @Test

   public void test1() throws Exception {

      SAXReader reader = new SAXReader(); //创建阅读器

      Document document = reader.read(new File("src//code1.xml")) //加载XML文档

      Element root = document.getRootElement(); //获取根元素

      display(root);

   }

      private void display(Element root) {

      // TODO Auto-generated method stub

      displayAttr(root); //获取属性

      for (Iterator<Element> i = root.elementIterator(); i.hasNext();) { //迭代输出

        Element ele = i.next();

        if (ele.isTextOnly()) {

           displayAttr(ele);

           System.out.println(ele.getText());

        } else {

           display(ele); //递归调用

        }

      }

   }

   @SuppressWarnings("unchecked")

   private void displayAttr(Element root) {

      // TODO Auto-generated method stub

      for (Iterator<Attribute> j = root.attributeIterator(); j.hasNext();) {

        Attribute attr = j.next();

        System.out.println(attr.getName() + " " + attr.getValue());

      }

   }

}

code1.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE books[

    <!ELEMENT books (book*)>

    <!ELEMENT book (name,author,price)>

    <!ELEMENT name (#PCDATA)>

    <!ELEMENT author (#PCDATA)>

    <!ELEMENT price (#PCDATA)>

    <!ATTLIST author address CDATA #IMPLIED>

]>

<books>

   <book>

      <name>Java开发</name>

      <author>佚名1</author>

      <price>10.00</price>

   </book>

   <book>

      <name>Java讲义</name>

      <author>佚名2</author>

      <price>11.00</price>

   </book>

   <book>

      <name>Java Web</name>

      <author address="保定-河软">佚名3</author>

      <price>12.00</price>

   </book>

   <book>

      <name>Java 基础</name>

      <author address="保定-河软">佚名4</author>

      <price>15.00</price>

   </book>

</books>

二、            使用Dom4jXML文档中写入内容

1、使用Dom4j直接创建一个新的XML文档

public void test2() throws Exception {

      Document document = DocumentHelper.createDocument();

      Element root = document.addElement("中国");

      Element newchild = root.addElement("省份");

      Element child = newchild.addElement("陕西省");

      child.setText("交通大学");

      child = newchild.addElement("河北省");

      child.setText("河北软件");

      child.addAttribute("dept", "软件系");

      child = newchild.addElement("北京市");

      child.setText("Microsoft");

      OutputFormat format = new OutputFormat("  ", true, "utf-8");

      XMLWriter xw = new XMLWriter(new FileWriter("src//code2.xml"), format);

      xw.write(document);

      xw.close();

}

2、使用Dom4jXML文档的指定位置写入一个元素

public void test4() throws Exception {

      SAXReader reader = new SAXReader();

      Document document = reader.read(new File("src//code2.xml"));

      Element root = document.getRootElement();

      Element child = DocumentHelper.createElement("天津市");

      child.setText("天津纺织工业大学"); //设置元素内容

      Element ele = (Element) root.elements("省份").get(1); //获取要写入的元素位置

      List list = ele.elements();

      list.add(1, child);

      OutputFormat format = new OutputFormat("  ", true, "utf-8");

      XMLWriter xw = new XMLWriter(new FileWriter("src//code2.xml"), format);

      xw.write(document);

      xw.close();

}

三、            删除XML文档中节点处的元素

public void test5() throws Exception {

      SAXReader reader = new SAXReader();

      Document document = reader.read(new File("src//code2.xml"));

      Element root = document.getRootElement();

      Element ele = (Element) root.elements().get(1);

      Element et = (Element) ele.elements().get(1);

      ele.remove(et);

      OutputFormat format = new OutputFormat("  ", true, "utf-8"); //格式化输出对象

      XMLWriter xw = new XMLWriter(new FileWriter("src//code2.xml"), format);

      xw.write(document);

      xw.close();

   }

四、            修改XML文档中元素的内容

   public void test6() throws Exception {

      SAXReader reader = new SAXReader();

Document document = reader.read(new File("src//code2.xml"));

      Element root = document.getRootElement();

      Element ele = (Element) root.elements().get(0);

      Element et = (Element) ele.elements().get(0);

      et.setText("陕西师范大学"); //修改元素内容

OutputFormat format = new OutputFormat("  ", true, "utf-8");

XMLWriter xw = new XMLWriter(new FileWriter("src//code2.xml"), format);

      xw.write(document);

      xw.close(); //关闭输出流

    }

以上便是利用Dom4jCRUD操作,其中遍历时的迭代方法很重要。另外在对XML文档中的元素进行修改和删除时的元素节点位置的获取也是一个重点。

原创粉丝点击