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

阅读更多
DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了Java 集合框架并完
全支持DOM,SAX 和 JAXP。 DOM4J 使用起来非常简单.只要你了解基本的 XML-DOM 模型,就能使用.
在下面的例子中,将遍历预定义好的Xml所有的节点的信息,并将取出的信息保存在实体类中.
首先,XMl定义如下:


	
number 1 1 2 date 1 1 5 storeNum 1 3 2 remarks 1 5 2
SerialNumber 0 0 1 1 Name 0 0 1 1 BatchNumber 0 0 1 1 imageStream 2 File 0 0 0 0 8 27 10 30
 定义好的实体类  GenericField 如下:   		
/**
 * @描述:这是一个实体类,用于存放文字域的数据。文字域是在 *.xml 中定义的
 * 文字域样式如下:
 * 
 * 		
* * aaaa * 1 * 16 * 34 * *
*
* @注明:文字域在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  heads = null;
	List 	bodys = null;

	/**
	 * @描述:遍历Xml文件的头部分
	 * 
	 * @param rootElement
	 * @return headerList
	 * 
	 * @author Yangcl
	 */
	public List head(Element rootElement) 
	{
		List headerList = new ArrayList(); 
		Element headerElement = rootElement.element("Header");		
		for(Iterator iter = headerElement.elementIterator();iter.hasNext();) 
		{
			Element attributeElement = (Element) iter.next();	
			// 取得Field节点下 的值
			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);
			//遍历完成一个域以后,形成一个Map对象,然后存入到一个List中保存
			headerList.add(gf);
		}
		return headerList;
	}
	
	/**
	 * @描述:遍历Xml文件的body部分
	 * 
	 * @param rootElement
	 * @return bodylist
	 * 
	 * @author Yangcl
	 */
	public List body(Element rootElement) 
	{
		List bodylist = new LinkedList();// 存储Body所有节点
		bodyElement = rootElement.element("Body");
		// 进入,遍历重复节点
		for (Iterator iter = bodyElement.elementIterator(); iter.hasNext();) 
		{
			Map fieldMap = new HashMap();
			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 head(Element rootElement):用于遍历Xml中节点
public List body(Element rootElement):用于遍历Xml中的节点
public void loadXmlMapping(String mappingURL):用于加载Xml,这里他是一个接口方法。在别的类中您可
以这样调用他:Report  r = new Report ()
		     r.loadXmlMapping("E:/work/Tamplates/config-reportMapping.xml");
在程序的代码段中,每一步定义的逻辑、目的都有比较详细的注释,在这里就不再敖述. 这些代码可以在您的成型的系统
中发挥作用, 关于测试的代码我就不贴了,您可以自己研究下. 如果有不能理解的段落, 您可以留言, 我会及时回复.
如果您想转载这篇文章, 请注明出处.

    关于如何取出属性:

    //取出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)