`
liuxi1024
  • 浏览: 391082 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用digester解析XML

阅读更多

1、bill.xml内容

<?xml version="1.0" encoding="GBK"?>
<document>
	<bill>
		<serialNo>20089220014</serialNo>                   <!-- 流水号 -->
		<termNo>N0795</termNo>                                  <!-- 机器号 -->
		<saleId>62</saleId>								    <!-- 售货单位备案登记编码 -->
		<saleName>发源</saleName>			<!-- 售货单位 -->

		<buyId>74</buyId>							        <!-- 购货单位备案登记编码 -->
		<buyName>基由</buyName>			  <!-- 购货单位 -->
		
		<totalWeight>40</totalWeight>                          <!-- 合计重量(公斤) -->
		<totalMoney>220</totalMoney>                           <!-- 合计金额(元)-->
		<saleDate>2008-8-18 00:00:00</saleDate>                 <!-- 交易时间 -->
		<status>0</status>                                      <!-- 是否作废 -1:作废 0/'':正常 -->
		
		<billItem>
			<variety>五花肉</variety>								<!-- 品 种 -->
			<weight>10</weight>									<!-- 重量(公斤) -->
			<price>5</price>									<!-- 单价(元/公斤) -->
			<total>50</total>									<!-- 金 额(元) -->
		</billItem>

		<billItem>
			<variety>纯瘦肉</variety>								<!-- 品 种 -->
			<weight>10</weight>									<!-- 重量(公斤) -->
			<price>6</price>									<!-- 单价(元/公斤) -->
			<total>60</total>									<!-- 金 额(元) -->
		</billItem>
		
		<billItem>
			<variety>猪蹄</variety>								<!-- 品 种 -->
			<weight>10</weight>									<!-- 重量(公斤) -->
			<price>5</price>									<!-- 单价(元/公斤) -->
			<total>50</total>									<!-- 金 额(元) -->
		</billItem>
		
		<billItem>
			<variety>猪耳朵</variety>								<!-- 品 种 -->
			<weight>10</weight>									<!-- 重量(公斤) -->
			<price>6</price>									<!-- 单价(元/公斤) -->
			<total>60</total>									<!-- 金 额(元) -->
		</billItem>
	</bill>
</document>

 2、解析xml 的类

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;

import org.apache.commons.digester.Digester;

import com.data.bill.entity.Bill;
import com.data.bill.entity.BillItem;
import com.util.DateHelper;


public class BillDigest {
	private Bill bill;

	public Bill getBill() {
		return bill;
	}

	private void initBill() {
		if (bill == null) {
			bill = new Bill();
		}
	}
	
	public void addBill(
			String serialNo, 
			String termNo, 
			String saleId, 
			String saleName, 
			String buyId, 
			String buyName,
			String totalWeight, 
			String totalMoney, 
			String saleDate, 
			String status) {
		initBill();
		bill.setSerialNo(stringToEmpty(serialNo));
		bill.setTermNo(stringToEmpty(termNo));
		bill.setSaleId(integerToEmpty(saleId));
		bill.setSaleName(stringToEmpty(saleName));
		bill.setBuyId(integerToEmpty(buyId));
		bill.setBuyName(stringToEmpty(buyName));

		bill.setTotalWeight(doubleToEmpty(totalWeight));
		bill.setTotalMoney(doubleToEmpty(totalMoney));
		bill.setSaleDate(DateHelper.parseDate(saleDate));
		bill.setStatus(integerToEmpty(status));
	}
	
	public void addBillItem(
			String variety, 
			String weight, 
			String price, 
			String total){
		initBill();
		BillItem item = new BillItem();
		item.setVariety(stringToEmpty(variety));
		item.setWeight(doubleToEmpty(weight));
		item.setPrice(doubleToEmpty(price));
		item.setTotal(doubleToEmpty(total));
		item.setHeader(bill);
		bill.getItems().add(item);
	}
	
	public static Bill getBill(File xmlFile) {
		BufferedReader reader = null;
		Bill bill = null;
		String s;
		StringBuffer buffer = new StringBuffer();
		try {
			reader = new BufferedReader(new FileReader(xmlFile));
			while((s = reader.readLine()) != null) {
				buffer.append(s);
			}
			bill = getBill(buffer.toString());
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
			bill = null;
		}
		return bill;
	}
	
	public static Bill getBill(InputStream is) {
		if (is == null) {
			return null;
		}
		
		BufferedReader reader = null;
		Bill bill = null;
		String s;
		StringBuffer buffer = new StringBuffer();
				
		try {
			reader = new BufferedReader(new InputStreamReader(is));
			while ((s = reader.readLine()) != null) {
				buffer.append(s);
			}
			bill = getBill(buffer.toString());
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
			bill = null;
		}
		
		return bill;
	}

	public static Bill getBill(String xml) {
		
		///StringBuffer buffer = new StringBuffer(xml);
		/*Pattern p = Pattern.compile("<[^>]*?>");
		Matcher m = p.matcher(buffer);
		while(m.find()) {
			buffer.replace(m.start(), m.end(), xml.substring(m.start(),m.end()).toLowerCase());
		}*/
		String parseXML = xml;
		
		Bill bill = null;
		BillDigest helper;
		//生成一个digester。主要需要引进commons-logging.jar、commons-collections.jar、commons-beanutils.jar
		Digester digester = new Digester();
		//设置对XML文档资料不进行DTD(Document type definition)验证
		digester.setValidating(false);
		//当遇见 document 元素的时候,产生一个BillDigest对象
		digester.addObjectCreate("document", BillDigest.class);
		//当遇见 document/bill 元素的时候,使用addBill方法进行赋值,有10个参数
		digester.addCallMethod("document/bill", "addBill", 10);
		//当遇见 document/bill/* 元素的时候,作为参数
		digester.addCallParam("document/bill/serialNo", 0);
		digester.addCallParam("document/bill/termNo", 1);
		digester.addCallParam("document/bill/saleId", 2);
		digester.addCallParam("document/bill/saleName", 3);
		digester.addCallParam("document/bill/buyId", 4);
		digester.addCallParam("document/bill/buyName", 5);
		digester.addCallParam("document/bill/totalWeight", 6);
		digester.addCallParam("document/bill/totalMoney", 7);
		digester.addCallParam("document/bill/saleDate", 8);
		digester.addCallParam("document/bill/status", 9);
		
		//当遇见 document/bill/billItem 元素的时候,使用addBillItem方法进行赋值,有4个参数
		digester.addCallMethod("document/bill/billItem", "addBillItem", 4);
		//当遇见 document/bill/billItem/* 元素的时候,作为参数
		digester.addCallParam("document/bill/billItem/variety", 0);
		digester.addCallParam("document/bill/billItem/weight", 1);
		digester.addCallParam("document/bill/billItem/price", 2);
		digester.addCallParam("document/bill/billItem/total", 3);
		
		try {
			//用digester解析指定的文件
			helper = (BillDigest)digester.parse(new StringReader(parseXML));
			bill = helper.getBill();
		}catch (Exception e) {
			e.printStackTrace();
			bill = null;
		}
		return bill;
	}
	
	public static String stringToEmpty(String obj)
	{
		if(obj==null){
			return "";
		}else{
			return obj;
		}
	}
	
	public static Integer integerToEmpty(String obj)
	{
		if(obj==null){
			return new Integer(0);
		}else{
			return Integer.valueOf(obj);
		}
	}
	
	public static Double doubleToEmpty(String obj)
	{
		if(obj==null){
			return new Double(0);
		}else{
			return Double.valueOf(obj);
		}
	}
}

 

 总结:通过调用

public static Bill getBill(File xmlFile) 、public static Bill getBill(InputStream is) 、public static Bill getBill(String xml) ,传入不同的参数,返回Bill对象。

分享到:
评论

相关推荐

    使用Digester解析XML文档示例

    ### 使用Digester解析XML文档示例 #### 一、Digester简介与应用场景 Digester是Apache Jakarta项目下的一个工具类库,它简化了基于SAX(Simple API for XML)的XML解析过程。Digester能够根据定义好的规则自动将...

    利用commons-digester解析xml

    标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...

    Digester解析XML文件

    本文将深入探讨如何使用Digester解析XML文件,以及在实际项目中如何应用。 首先,让我们了解什么是Apache Commons Digester。这是一个Java库,它的主要功能是读取XML文件,并基于一系列预先定义的规则(Rule),...

    digester解析xml的问题.pdf

    在使用 Digester 进行 XML 解析时,我们需要进行以下步骤: 1. **引入 Digester 库**:在 Java 项目中,首先需要引入 Apache Commons Digester 库。通常通过 Maven 或 Gradle 管理依赖,Maven 可添加如下依赖: ``...

    digester解析XML文件实例

    学习这个实例,你不仅能够掌握如何使用Digester解析XML,还能了解到如何设计符合XML结构的Java类,以及如何定义和组织规则。这将对你的Java开发技能和处理XML数据的能力有显著提升。同时,理解Digester也能帮助你更...

    Digester解析XML

    要使用Digester解析XML文档,首先需要创建一个 `org.apache.commons.digester.Digester` 类的实例,并配置必要的模式和规则,最后调用 `parse()` 方法。 以下是一个简单的示例代码: ```java import org.apache....

    digester 解析xml

    **使用Digester解析XML并验证** 1. **设置 Digester 规则** 在使用Digester之前,我们需要定义一系列规则,告诉Digester在遇到XML文档的哪些元素时执行什么操作。这些规则通常涉及到创建新对象、设置对象属性或者...

    digester解析xml必备包.rar

    在Java开发中,XML(eXtensible Markup Language)是一种常用的数据交换格式,用于存储和传输数据。...这个“digester解析xml必备包”提供了一整套解决方案,方便开发者在项目中快速集成和使用XML解析功能。

    Digester读取xml教程.rar

    《使用Digester解析XML的深度指南》 在Java开发中,处理XML文件是常见的任务,而Apache Commons Digester库提供了一种高效且便捷的方式来解析XML并将其映射到Java对象。本教程将深入探讨如何使用Digester来读取XML...

    org.apache.commons.digester解析XML.rar

    这个“org.apache.commons.digester解析XML.rar”压缩包包含了一个测试工程,它演示了如何使用Digester库来解析XML文件并映射到Java对象上。下面将详细介绍这个库的功能、使用方法以及在实际开发中的应用。 1. **...

    XML的解析之——使用Digester

    总结一下,使用Apache Digester解析XML的优点在于它的灵活性和自动化。你可以根据XML结构自定义消化规则,让解析过程变得简单高效。此外,由于它是开源的,开发者可以查看源码,了解其工作原理,甚至扩展其功能。在...

    使用Apache的Digester来解析XML文档

    5. **解析XML**:最后,使用配置好的 Digester 对象解析XML文件: ```java Root root = null; try (InputStream is = new FileInputStream("path_to_xml_file.xml")) { root = digester.parse(is); } catch ...

    Digester解析XML的小例子(对象嵌套)

    在Java开发中,Struts框架提供了一个强大的工具——Digester,用于解析XML文件并自动创建、配置Java对象。本文将详细介绍如何使用Digester处理具有嵌套结构的XML文档,并通过一个具体的实例——"DigesterXmlTest"来...

    Digester解析XML问题.pdf

    在示例代码中, DigesterDriver演示了如何配置 Digester来解析XML文件,创建`Catalog`对象并填充其`Book`和`Magazine`子对象,以及相关的`Article`对象。每个元素的属性通过`addBeanPropertySetter()`设置,而对象...

    java反射,Digester解析xml文档

    3. **解析XML**:使用 Digester 的 `parse()` 方法读取XML文件,根据预先定义的规则进行处理。 4. **结果处理**:最后,Digester会生成一个对象模型,代表了XML文档的内容。 以下是一个简单的 Digester 使用示例: ...

    Java_XML解析之Digester的使用

    以下是一个简单的示例,展示了如何使用Digester解析XML: ```java package mypackage; public class Foo { // ... (Foo类的属性和方法) } public class Bar { // ... (Bar类的属性和方法) } // XML文档片段: ...

    digester解析xml 所需jar包

    本篇文章将详细介绍如何使用`Digester`解析XML,以及在使用过程中需要的依赖库。 首先,`Digester`的核心功能是通过定义规则来将XML元素与Java对象的属性或方法关联,这样在解析XML时,可以自动创建和填充Java对象...

Global site tag (gtag.js) - Google Analytics