java 解析并生成 XML

在 java 中使用 Dom4j 解析 XML

  对 XML 文件的解析,通常使用的是 Dom4j 和 jdom 作为XML解析工具。

  在此只介绍下 Dom4j 对 XML 文件的解析使用方法。

  1. 明白了解 XML 文件的树结构

  2. 了解 DOM4J 的一些接口

1. XML 文件的树结构(:XML :http://www.w3school.com.cn/xml/xml_tree.asp)

  XML 文档形成一种树结构

  XML 文档必须包含根元素。该元素是所有其他元素的父元素。

  XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。

  所有元素均可拥有子元素:

 <root>
<child>
<subchild>.....</subchild>
</child>
</root>

  父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。

  所有元素均可拥有文本内容和属性(类似 HTML 中)。


实例:

java 解析并生成 XML

  上图表示下面的 XML 中的一本书:

 <bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

  例子中的根元素是 <bookstore>。文档中的所有 <book> 元素都被包含在 <bookstore> 中。

  <book> 元素有 4 个子元素:<title>、< author>、<year>、<price>。

  所以,对 XML 文件的解析,无非就是从 XML 文件中获取到根元素与子元素。

  对此 Dom4j 已经对一些需要使用的方法进行了封装。


2. 了解DOM4J的一些接口 (附:http://www.blogjava.net/i369/articles/154264.html)

  1.  读取并解析XML文档:
      // 从文件读取XML,输入文件名,返回XML文档
    public Document read(String fileName) throws MalformedURLException, DocumentException {
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File(fileName));
    return document;
    }

  其中,reader的read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取。得到的Document对象就带表了整个XML。

  2.  取得 root 结点

    public Element getRootElement(Document doc){ return doc.getRootElement(); }  

  使用 getRootElement 直接可以返回root结点.

  3. 遍历 XML 树

  DOM4J提供至少3种遍历节点的方法,在此只取两种方法进行记录.

  1) 枚举

  // 枚举所有子节点
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
// do something
}
// 枚举名称为foo的节点
for ( Iterator i = root.elementIterator(foo); i.hasNext();) {
Element foo = (Element) i.next();
// do something
}
// 枚举属性
for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
// do something
}

  2) 递归

     public void treeWalk() {
treeWalk(getRootElement());
}
public void treeWalk(Element element) {
for (int i = 0, size = element.nodeCount(); i < size; i++) {
Node node = element.node(i);
if (node instanceof Element) {
treeWalk((Element) node);
} else { // do something....
}
}
}

  

  附:

Attribute
Attribute定义了XML的属性
Branch
Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为,
CDATA
CDATA 定义了XML CDATA 区域
CharacterData
CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment, Text.
Comment
Comment 定义了XML注释的行为
Document
定义了XML文档
DocumentType
DocumentType 定义XML DOCTYPE声明
Element
Element定义XML 元素
ElementHandler
ElementHandler定义了 Element 对象的处理器
ElementPath
被 ElementHandler 使用,用于取得当前正在处理的路径层次信息
Entity
Entity定义 XML entity
Node
Node为所有的dom4j中XML节点定义了多态行为
NodeFilter
NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)
ProcessingInstruction
ProcessingInstruction 定义 XML 处理指令.
Text
Text 定义XML 文本节点.
Visitor
Visitor 用于实现Visitor模式.
XPath
XPath 在分析一个字符串后会提供一个XPath 表达式

实例:附:)http://www.cnblogs.com/nerxious/archive/2013/05/04/3060263.html

  在使用过程中需要下载:  DOM4J*点击下载

  首先我们需要出创建一个xml文档,然后才能对其解析

  XML文档:

 <?xml version="1.0" encoding="UTF-8"?>
<HD>
<disk name="C">
<capacity>8G</capacity>
<directories>200</directories>
<files>1580</files>
</disk> <disk name="D">
<capacity>10G</capacity>
<directories>500</directories>
<files>3000</files>
</disk>
</HD>

示例一:用List列表的方式来解析xml

 package dom;

 import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class Demo { public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
File file = new File("test.xml");
Document document = reader.read(file);
Element root = document.getRootElement();
List<Element> childElements = root.elements();
for (Element child : childElements) {
//未知属性名情况下
/*List<Attribute> attributeList = child.attributes();
for (Attribute attr : attributeList) {
System.out.println(attr.getName() + ": " + attr.getValue());
}*/ //已知属性名情况下
System.out.println("name: " + child.attributeValue("name")); //未知子元素名情况下
/*List<Element> elementList = child.elements();
for (Element ele : elementList) {
System.out.println(ele.getName() + ": " + ele.getText());
}
System.out.println();*/ //已知子元素名的情况下
System.out.println("capacity: " + child.elementText("capacity"));
System.out.println("directories: " + child.elementText("directories"));
System.out.println("files: " + child.elementText("files"));
//这行是为了格式化美观而存在
System.out.println();
}
} }

示例二:使用Iterator迭代器的方式来解析xml

 package dom;

 import java.io.File;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class Demo1 {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("test.xml"));
Element root = document.getRootElement(); Iterator it = root.elementIterator();
while (it.hasNext()) {
Element element = (Element) it.next(); //未知属性名称情况下
/*Iterator attrIt = element.attributeIterator();
while (attrIt.hasNext()) {
Attribute a = (Attribute) attrIt.next();
System.out.println(a.getValue());
}*/ //已知属性名称情况下
System.out.println("name: " + element.attributeValue("name")); //未知元素名情况下
/*Iterator eleIt = element.elementIterator();
while (eleIt.hasNext()) {
Element e = (Element) eleIt.next();
System.out.println(e.getName() + ": " + e.getText());
}
System.out.println();*/ //已知元素名情况下
System.out.println("capacity: " + element.elementText("capacity"));
System.out.println("directories: " + element.elementText("directories"));
System.out.println("files: " + element.elementText("files"));
System.out.println();
}
}
}

示例三:创建xml文档并输出到文件

 package dom;

 import java.io.File;
import java.io.FileOutputStream; import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter; public class Demo2 {
public static void main(String[] args) throws Exception {
Document doc = DocumentHelper.createDocument();
//增加根节点
Element HD = doc.addElement("HD");
//增加子元素
Element disk = HD.addElement("disk");
Element capacity1 = disk.addElement("capacity");
Element directories1 = disk.addElement("directories");
Element files1 = disk.addElement("files"); Element disk2 = HD.addElement("disk");
Element capacity2 = disk2.addElement("capacity");
Element directories2 = disk2.addElement("directories");
Element files2 = disk2.addElement("files"); //为子节点添加属性
disk.addAttribute("name", "C");
//为元素添加内容
capacity1.setText("8G");
directories1.setText("2000");
files1.setText("1580"); disk2.addAttribute("name", "D");
//为元素添加内容
capacity1.setText("10G");
directories1.setText("500");
files1.setText("3000"); //实例化输出格式对象
OutputFormat format = OutputFormat.createPrettyPrint();
//设置输出编码
format.setEncoding("UTF-8");
//创建需要写入的File对象
File file = new File("D:" + File.separator + "test.xml");
//生成XMLWriter对象,构造函数中的参数为需要输出的文件流和格式
XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
//开始写入,write方法中包含上面创建的Document对象
writer.write(doc);
}
}

对 XML 文件的解析 和 对生成 XML 文件,关键在于对 XML 树结构的理解.

上一篇:【一些小常识】Linux文件目录的通配符用法/*


下一篇:Linux audio驱动模型