DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了Java 集合框架并完
全支持DOM,SAX 和 JAXP。 DOM4J 使用起来非常简单.只要你了解基本的 XML-DOM 模型,就能使用.
在下面的例子中,将遍历预定义好的Xml所有的节点的信息,并将取出的信息保存在实体类中.
首先,XMl定义如下:
<?xml version="1.0" encoding="UTF-8"?>
<ReportMapping>
<Header>
<Field>
<name>number</name>
<type>1</type>
<beginRow>1</beginRow>
<beginCell>2</beginCell>
</Field>
<Field>
<name>date</name>
<type>1</type>
<beginRow>1</beginRow>
<beginCell>5</beginCell>
</Field>
<Field>
<name>storeNum</name>
<type>1</type>
<beginRow>3</beginRow>
<beginCell>2</beginCell>
</Field>
<Field>
<name>remarks</name>
<type>1</type>
<beginRow>5</beginRow>
<beginCell>2</beginCell>
</Field>
</Header>
<Body name="XXXX" startRow="10" finishRow="22" >
<Field>
<name>SerialNumber</name>
<index>0</index>
<type>0</type>
<beginRow>1</beginRow>
<beginCell>1</beginCell>
</Field>
<Field>
<name>Name</name>
<index>0</index>
<type>0</type>
<beginRow>1</beginRow>
<beginCell>1</beginCell>
</Field>
<Field>
<name>BatchNumber</name>
<index>0</index>
<type>0</type>
<beginRow>1</beginRow>
<beginCell>1</beginCell>
</Field>
</Body>
<Images>
<Image>
<name>imageStream</name>
<type>2</type>
<imageInputStream>File</imageInputStream>
<Dx1>0</Dx1>
<Dy1>0</Dy1>
<Dx2>0</Dx2>
<Dy2>0</Dy2>
<shortCol1>8</shortCol1>
<row1>27</row1>
<shortCol2>10</shortCol2>
<row2>30</row2>
</Image>
</Images>
</ReportMapping>
定义好的实体类 GenericField 如下:
/**
* @描述:这是一个实体类,用于存放文字域的数据。文字域是在 *.xml 中定义的
* 文字域样式如下:
* <ReportMapping>
* <Header>
* <Field>
* <name>aaaa</name>
* <type>1</type>
* <beginRow>16</beginRow>
* <beginCell>34</beginCell>
* </Field>
* </Header>
* </ReportMapping>
* @注明:文字域在Header(表示模板的头部分)和Footer(标识模板的脚部分)应用较多
* @author Yangcl
*
*/
public class GenericField
{
private String name;
private int type;
private int beginRow;
private int beginCell;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getBeginRow() {
return beginRow;
}
public void setBeginRow(int beginRow) {
this.beginRow = beginRow;
}
public int getBeginCell() {
return beginCell;
}
public void setBeginCell(int beginCell) {
this.beginCell = beginCell;
}
}
在上一篇文章中“利用POI在Excel文档任意单元格写入数据”,是这篇文章的铺垫. beginRow:是你单元格的起始
行坐标,beginCell是你单元格的起始列坐标. name 这个属性在这片文章中您可以姑且理解为你要在这个单元格写入
的信息.如果向更深层次的扩展,这个name属性可以和 Map 的 Key值做匹配, 从而引入Map的Value值, 再向更深的
地方扩展您可以将 现在系统中普遍使用的一种轻量级数据交换格式:json联系起来. 将 json数据串用Gson转换成为
Map格式数据,然后在写入到Excel中. 后面的文章会提到一些关于Gson的内容,如果您有什么更好的观点, 希望您给我
留言, 我会认真接受.
下面进入正题:如何遍历和存储这些数据节点信息
package manager;
import java.io.File;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import manager.entity.BodyField;
import manager.entity.GenericField;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Report
{
Document document = null;
Element bodyElement = null;
List<GenericField> heads = null;
List<BodyField> bodys = null;
/**
* @描述:遍历Xml文件的头部分
*
* @param rootElement
* @return headerList
*
* @author Yangcl
*/
public List<GenericField> head(Element rootElement)
{
List<GenericField> headerList = new ArrayList<GenericField>();
Element headerElement = rootElement.element("Header");
for(Iterator iter = headerElement.elementIterator();iter.hasNext();)
{
Element attributeElement = (Element) iter.next();
// 取得Field节点下 <name>的值
String fieldName = attributeElement.elementTextTrim("name");
String fieldType = attributeElement.elementTextTrim("type");
String fieldRow = attributeElement.elementTextTrim("beginRow");
String fieldCell = attributeElement.elementTextTrim("beginCell");
// 转换为 int类型数据
int intFieldType = new Integer(fieldType);
int intFieldRow = new Integer(fieldRow);
int intFieldCell = new Integer(fieldCell);
// 放入实体类中
GenericField gf = new GenericField();
gf.setName(fieldName);
gf.setType(intFieldType);
gf.setBeginRow(intFieldRow);
gf.setBeginCell(intFieldCell);
//遍历完成一个<Field>域以后,形成一个Map对象,然后存入到一个List中保存
headerList.add(gf);
}
return headerList;
}
/**
* @描述:遍历Xml文件的body部分
*
* @param rootElement
* @return bodylist
*
* @author Yangcl
*/
public List<BodyField> body(Element rootElement)
{
List<BodyField> bodylist = new LinkedList<BodyField>();// 存储Body所有节点
bodyElement = rootElement.element("Body");
// 进入<Body>,遍历重复节点
for (Iterator iter = bodyElement.elementIterator(); iter.hasNext();)
{
Map<String, Object> fieldMap = new HashMap<String, Object>();
Element element = (Element) iter.next();
// 取得Field节点下的值
String xml_Name = element.elementTextTrim("name");
String xml_Index = element.elementTextTrim("index");
String xml_Type = element.elementTextTrim("type");
String xml_Row = element.elementTextTrim("beginRow");
String xml_Cell = element.elementTextTrim("beginCell");
// 转换为 int类型数据
int intFieldIndex = new Integer(xml_Index);
int intFieldType = new Integer(xml_Type);
int intFieldRow = new Integer(xml_Row);
int intFieldCell = new Integer(xml_Cell);;
// 放入实体类中
BodyField bf = new BodyField();
bf.setName(xml_Name);
bf.setType(intFieldType);
bf.setBeginRow(intFieldRow);
bf.setBeginCell(intFieldCell);
bf.setIndex(intFieldIndex);
bodylist.add(bf);
}
return bodylist;
}
/**
* @描述:这个方法用于加载Xml文件,取得节点中的所有信息。
*
* @param mappingURL
*
* @author Yangcl
*/
public void loadXmlMapping(String mappingURL)
{
File xmlConfigFile = new File(mappingURL);
SAXReader saxReader = new SAXReader();
try {
document = saxReader.read(xmlConfigFile);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Element rootElement = document.getRootElement();// 获取根节点:ReportMapping
heads = head(rootElement);
bodys = body(rootElement);
foots = foot(rootElement);
image = image(rootElement);
}
}
每个方法的是做什么的
public List<GenericField> head(Element rootElement):用于遍历Xml中<head>节点
public List<BodyField> body(Element rootElement):用于遍历Xml中的<body>节点
public void loadXmlMapping(String mappingURL):用于加载Xml,这里他是一个接口方法。在别的类中您可
以这样调用他:Report r = new Report ()
r.loadXmlMapping("E:/work/Tamplates/config-reportMapping.xml");
在程序的代码段中,每一步定义的逻辑、目的都有比较详细的注释,在这里就不再敖述. 这些代码可以在您的成型的系统
中发挥作用, 关于测试的代码我就不贴了,您可以自己研究下. 如果有不能理解的段落, 您可以留言, 我会及时回复.
如果您想转载这篇文章, 请注明出处.
关于如何取出<body>属性:
//取出Body属性
//取出类型为String
String bodyName = bodyElement.attribute("name").getValue();
String aaa = bodyElement.attribute("startRow").getValue();
String bbb = bodyElement.attribute("finishRow").getValue();
int startRow = new Integer(aaa); //强制转化为 int
int finishRow = new Integer(bbb);
分享到:
相关推荐
3. **基本概念**:介绍DOM4J中的核心类,如`Document`(文档对象)、`Element`(元素)、`Attribute`(属性)、`Text`(文本节点)等,以及它们之间的关系。 4. **解析XML**:讲解如何使用DOM4J解析XML文件,包括...
- **`org.dom4j.Branch`**:这是一个抽象类,为能够包含子节点的节点定义了公共行为,例如元素和文档。 - **`org.dom4j.CDATA`**:代表XML中的CDATA区域,通常用于存储不被解析器解析的文本块。 - **`org.dom4j....
- **Document**: 在 dom4j 中,`Document` 类代表整个 XML 文档,它是所有元素和属性的根节点。 - **Element**: `Element` 类是 XML 元素的核心表示,它包含了元素的名称、属性和子元素。 - **Attribute**: `...
DOM4j提供了多种方式来读取和解析XML文档,主要是通过`org.dom4j.io`包中的`SAXReader`和`DOMReader`类。`SAXReader`适用于大文件的快速解析,而`DOMReader`则更适合小型文件。 以下是一个使用`SAXReader`从文件...
一旦DOM4J树构建完成,就可以通过遍历或查询来获取节点: ```java // 获取根元素 Element root = doc.getRootElement(); // 获取子节点 List<Element> elements = root.elements("子元素名称"); ``` ##### 3. ...
这篇官方文档详细阐述了DOM4J的使用方法和功能,对于理解并应用DOM4J至关重要。以下是对DOM4J API的一些核心知识点的详细解释: 1. **DOM4J的基本概念** - **Element**: 表示XML的元素节点,可以包含属性、文本和...
#### 四、Dom4j 与其他 XML 解析器的比较 - **DOM**:基于树形结构,适合需要随机访问节点的场合。但当处理大型 XML 文件时,内存消耗较大。 - **SAX**:基于事件驱动模型,适合于流式的处理方式。当 XML 数据量...
### 使用DOM4j实现权限分配:深入解析与实践 #### 概述 DOM4j(Document Object Model for XML)是一个Java编程语言的开源XML处理库,它提供了强大的API用于读写XML文档。本文将深入探讨如何利用DOM4j实现一个灵活...
#### 四、使用 DOM4j 修改 XML 文件 DOM4j 支持对 XML 文件的修改,包括添加、删除或更新节点。例如,修改某个元素的值: ```java Element element = root.element("元素名称"); element.setText("新的文本内容");...
【DOM4J基础使用指南】 DOM4J是一个强大的开源XML解析库,专为Java平台设计。它不仅提供了对DOM(文档对象模型)、SAX(简单API for XML)和JAXP(Java API for XML Processing)的支持,还融入了Java集合框架,...
**Dom4j详解** Dom4j是一个开源的Java库,用于处理XML文档。它提供了简单易用且功能强大的API,使得XML的解析、创建、修改和遍历变得更加方便。Dom4j是基于DOM(文档对象模型)的,但相比标准DOM,它在内存占用和...
通过本文介绍的方法,我们可以轻松地使用Dom4j读取和解析XML文件,并将数据封装到实体类中,这对于处理复杂的XML数据结构非常有用。同时,这种方法也为我们提供了一个灵活的方式来管理数据,无论是用于前端展示还是...
- **SAXReader**: DOM4J提供SAXReader类,用于基于SAX(Simple API for XML)解析XML文件,它以事件驱动的方式逐个处理XML文档的节点,占用内存较小。 - **DOMReader**: 使用DOMReader可以基于DOM模型解析XML,但...
### Dom4j 使用简介 #### 一、Dom4j 概述 Dom4j 是一个易用且功能强大的开源 XML 解析库,适用于 Java 平台。它支持 DOM、SAX 和 JAXP 标准,并且采用了 Java 集合框架进行数据管理。Dom4j 在设计时考虑到了开发者...
DOM4j是一个流行的Java库,专门用于处理XML文档。它提供了灵活且高性能的方式来解析、创建、操作和遍历XML结构。DOM4j API文档是学习和掌握这个库的关键资源,包含详细的方法解释、示例代码以及最佳实践。下面将深入...
在实际应用中,DOM4j 提供了许多便利的 API 来创建、读取和修改 XML 文档。例如,你可以使用 `DocumentFactory` 创建新的 XML 文档,通过 `Element` 接口的 `addAttribute` 方法添加属性,或者使用 `XPath` 类来执行...