`

Dom4j高级应用:遍历节点信息与实体类的存储

阅读更多
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);	
 

 

 

 

分享到:
评论

相关推荐

    DOM4J帮助文档及使用教程

    3. **基本概念**:介绍DOM4J中的核心类,如`Document`(文档对象)、`Element`(元素)、`Attribute`(属性)、`Text`(文本节点)等,以及它们之间的关系。 4. **解析XML**:讲解如何使用DOM4J解析XML文件,包括...

    dom4j详细使用用法

    - **`org.dom4j.Branch`**:这是一个抽象类,为能够包含子节点的节点定义了公共行为,例如元素和文档。 - **`org.dom4j.CDATA`**:代表XML中的CDATA区域,通常用于存储不被解析器解析的文本块。 - **`org.dom4j....

    dom4j 源码

    - **Document**: 在 dom4j 中,`Document` 类代表整个 XML 文档,它是所有元素和属性的根节点。 - **Element**: `Element` 类是 XML 元素的核心表示,它包含了元素的名称、属性和子元素。 - **Attribute**: `...

    dom4j例子与简介

    DOM4j提供了多种方式来读取和解析XML文档,主要是通过`org.dom4j.io`包中的`SAXReader`和`DOMReader`类。`SAXReader`适用于大文件的快速解析,而`DOMReader`则更适合小型文件。 以下是一个使用`SAXReader`从文件...

    DOM4J从基础到精通

    一旦DOM4J树构建完成,就可以通过遍历或查询来获取节点: ```java // 获取根元素 Element root = doc.getRootElement(); // 获取子节点 List&lt;Element&gt; elements = root.elements("子元素名称"); ``` ##### 3. ...

    dom4j API (javasoft官方文档)

    这篇官方文档详细阐述了DOM4J的使用方法和功能,对于理解并应用DOM4J至关重要。以下是对DOM4J API的一些核心知识点的详细解释: 1. **DOM4J的基本概念** - **Element**: 表示XML的元素节点,可以包含属性、文本和...

    Dom4j实现XMl

    #### 四、Dom4j 与其他 XML 解析器的比较 - **DOM**:基于树形结构,适合需要随机访问节点的场合。但当处理大型 XML 文件时,内存消耗较大。 - **SAX**:基于事件驱动模型,适合于流式的处理方式。当 XML 数据量...

    使用dom4j实现权限分配

    ### 使用DOM4j实现权限分配:深入解析与实践 #### 概述 DOM4j(Document Object Model for XML)是一个Java编程语言的开源XML处理库,它提供了强大的API用于读写XML文档。本文将深入探讨如何利用DOM4j实现一个灵活...

    dom4j从基础到精通.docx

    #### 四、使用 DOM4j 修改 XML 文件 DOM4j 支持对 XML 文件的修改,包括添加、删除或更新节点。例如,修改某个元素的值: ```java Element element = root.element("元素名称"); element.setText("新的文本内容");...

    Dom4j基础使用指南

    【DOM4J基础使用指南】 DOM4J是一个强大的开源XML解析库,专为Java平台设计。它不仅提供了对DOM(文档对象模型)、SAX(简单API for XML)和JAXP(Java API for XML Processing)的支持,还融入了Java集合框架,...

    Dom4j资料

    **Dom4j详解** Dom4j是一个开源的Java库,用于处理XML文档。它提供了简单易用且功能强大的API,使得XML的解析、创建、修改和遍历变得更加方便。Dom4j是基于DOM(文档对象模型)的,但相比标准DOM,它在内存占用和...

    详细介绍使用Dom4j读取xml文件的方法

    通过本文介绍的方法,我们可以轻松地使用Dom4j读取和解析XML文件,并将数据封装到实体类中,这对于处理复杂的XML数据结构非常有用。同时,这种方法也为我们提供了一个灵活的方式来管理数据,无论是用于前端展示还是...

    dom4j-1.6.1-API.zip

    - **SAXReader**: DOM4J提供SAXReader类,用于基于SAX(Simple API for XML)解析XML文件,它以事件驱动的方式逐个处理XML文档的节点,占用内存较小。 - **DOMReader**: 使用DOMReader可以基于DOM模型解析XML,但...

    Dom4j 使用简介

    ### Dom4j 使用简介 #### 一、Dom4j 概述 Dom4j 是一个易用且功能强大的开源 XML 解析库,适用于 Java 平台。它支持 DOM、SAX 和 JAXP 标准,并且采用了 Java 集合框架进行数据管理。Dom4j 在设计时考虑到了开发者...

    DOM4jAPI文档

    DOM4j是一个流行的Java库,专门用于处理XML文档。它提供了灵活且高性能的方式来解析、创建、操作和遍历XML结构。DOM4j API文档是学习和掌握这个库的关键资源,包含详细的方法解释、示例代码以及最佳实践。下面将深入...

    JAVA操作XMLDOM4j简单教程1

    在实际应用中,DOM4j 提供了许多便利的 API 来创建、读取和修改 XML 文档。例如,你可以使用 `DocumentFactory` 创建新的 XML 文档,通过 `Element` 接口的 `addAttribute` 方法添加属性,或者使用 `XPath` 类来执行...

Global site tag (gtag.js) - Google Analytics