在 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 中)。


实例:

  上图表示下面的 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 树结构的理解.

java 解析并生成 XML的更多相关文章

  1. Java解析和生成XML

    1.Jaxb处理java对象和xml之间转换常用的annotation有: @XmlType @XmlElement @XmlRootElement @XmlAttribute @XmlAccesso ...

  2. 【转载并整理】JAVA解析或生成xml的四种方法

    参考文章 1:http://blog.csdn.net/clemontine/article/details/53011362 2:http://www.jb51.net/article/98456. ...

  3. 使用Pull解析器生成XML文件和读取xml文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  4. SAX解析和生成XML文档

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...

  5. maven中使用dom4j解析、生成XML的简易方法

    此片文章主要写一些关于如何在maven工程中使用dom4j来解析或生成XML的建议方法,实际可使用的写法不仅限于如下所写的样例代码.此处进攻快速入手和提供思路使用. 首先配置pom.xml中的依赖的包 ...

  6. 使用Pull解析器生成XML文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  7. Java之JDOM生成XML和解析

    一.生成XML文件 1.JDOM是对Java原始的类进行了封装.让解析XML文件变得很方便 2.创建一个XML文件的根节点: Element root = new Element("HD&q ...

  8. Android 下用 Pull 解析和生成 XML

    Java 中是可以用 SAX 和 DOM 解析 XML  的,虽然在 Android 下也可以用这2中方式,但是还是推荐用 Pull.Pull 使用简单,效率相对高,Android 下是集成了 Pul ...

  9. PHP解析和生成xml(DOMDocument版)

    上次和大家分享了SimpleXML操作xml的一些知识,但是php中除了simplexml还有DOMDocument,这次就着重来看看DOMDocument的用法,还是把生成xml和解析xml分开写 ...

随机推荐

  1. Python: 利用Python进行数据分析 学习记录

    -----15:18 2016/10/14----- 1. import numpy as np;import pandas as pd values = pd.Series(np.random.no ...

  2. vector

    .vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. .vector容器最擅长的工作是: 利用位置索引存储容器中的单个元素. 以任何顺序迭代容器中的元素. 在容器的末尾追加和删除元素. ...

  3. java 标签库(核心,xml,sql ,国际化,函数)

    java标签库分分为上述几种,一般经常使用的是核心和函数,接下来会分别讲解这几种,和常见的用法. 一般标签库会和el表达式一起使用,所以在学习标签库前最后也学习下el表达式的使用. 导入后展开 可以从 ...

  4. Navicat Premium连接Oracle 问题汇总

  5. zookeeper3.3.6 伪分布式安装

    下载地址(http://zookeeper.apache.org/releases.html#download)   一:下载zookeeper的安装包,解压,进入到zk的目录文件,进入conf目录 ...

  6. mac包管理器Homebrew安装命令

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  7. 【React】dva-cli建立脚手架后发现页面样式不对的问题

    用dva-cli作为脚手架建立工程后,开始尝试编写页面.然后立马发现一个坑爹的问题. 在我less文件里面写了一个class ,比如:MainHead. 但是编译出来之后发现css文件里面变成了 Ma ...

  8. 第二十二篇:在SOUI中使用代码向窗口中插入子窗口

    使用SOUI开发客户端UI程序,通常也推荐使用XML代码来创建窗口,这样创建的窗口使用方便,当窗口大小改变时,内部的子窗口也更容易协同变化. 但是最近不断有网友咨询如何使用代码来创建SOUI子窗口,特 ...

  9. UWP 颜色选择器(ColorPicker) 和 自定义的Flyout(AdvancedFlyout)

    ColorPicker 故事背景 项目里面需要一个像Winfrom里面那样的颜色选择器,如下图所示: 在网上看了一下.没有现成的东东可以拿来使用.大概查看了一下关于颜色的一些知识,想着没人种树,那就由 ...

  10. android二维码生成

    前生: 一维码:条形码  数字 缺点:不好看,占面积, 好了,请看效果图: 在准备之前我们要导一个包:core-3.2.1.jar 下载请访问: http://download.csdn.net/do ...