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

digester解析XML的两种方法

 
阅读更多

1、xml格式如下,多个<bill>标签

<?xml version="1.0" encoding="GBK"?>
<sell>
	<bill ss="1">						
		<sn>2010E01234</sn>				
		<bt>A123456789,B123456789</bt>	
		<oc>abc123</oc>					
		<on>方鑫利群专卖</on>			

		<pc>20001</pc>                  <!-- //买方编号 -->
		<pn>测试用户</pn>				<!-- //买方名称 -->
		<pd>1234567890ABCDE</pd>        <!-- //买方卡号 -->
		<ts>7</ts>						<!-- //总数量 -->
		<tz>5.000</tz>					<!-- //总重量 -->
		<ta>75.00</ta>					<!-- //总金额 -->
		
		<sd>2010-08-20 12:10:10</sd>	<!-- 销售时间 -->
		<item>
			<cn>白条一级</cn>				<!-- //品名 -->
			<ct>3</ct>						<!-- 数量 -->
			<tw>2.000</tw>					<!-- 重量 -->
			<tp>15.50</tp>					<!-- 单价 -->
			<tt>30.00</tt>					<!-- 金额 -->
			<bn>222,333</bn>				<!-- 酮体编号 -->
		</item>
		<item>
			<cn>白条特级</cn>				<!-- //品名 -->
			<ct>5</ct>						<!-- 数量 -->
			<tw>3.000</tw>					<!-- 重量 -->
			<tp>15.50</tp>					<!-- 单价 -->
			<tt>45.00</tt>					<!-- 金额 -->
			<bn>111,332</bn>				<!-- 酮体编号 -->
		</item>
		...
	</bill>
	
	...
</sell>

 

2、采用 digester解析,这里介绍有两种方法

 

完整代码如下

package org.mcp.data.logic;

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 java.util.ArrayList;
import java.util.List;

import org.apache.commons.digester.Digester;
import org.mcp.data.entity.Bill;
import org.mcp.data.entity.BillItem;
import org.mcp.util.DateConverterPlugin;
import org.mcp.util.DateHelper;
import org.mcp.util.EmptyStringUtil;


public class BillDigest {
	private Bill bill;
	private List<Bill> billList;

	public Bill getBill() {
		if(bill ==null)
			bill = new Bill();
		return bill;
	}
	
	private void initBill(){
		if(bill==null){
			bill = new Bill();
		}
	}
	
	public List<Bill> getBillList(){
		return billList;
	}
	
	private void initBillList(){
		if(billList ==null){
			billList = new ArrayList<Bill>();
		}
	}
	
	public void addBillList(
			String serialNo, 
			String incoming,
			String termNo, 
			String saleId, 
			String saleName, 
			String buyId, 
			String buyName,
			String buyCardNo,
			String totalWeight, 
			String totalMoney, 
			String saleDate, 
			String status,
			String userId,
			String meatTypeID) {
		initBillList();
		bill = this.getBill();
		bill.setSerialNo(EmptyStringUtil.stringToEmpty(serialNo));
		bill.setIncoming(EmptyStringUtil.stringToEmpty(incoming));
		bill.setTermNo(EmptyStringUtil.stringToEmpty(termNo));
		bill.getSupplier().setOrgNo(EmptyStringUtil.stringToEmpty(saleId));
		//bill.getSaleName().setOrgName(EmptyStringUtil.stringToEmpty(saleName));
		bill.getBuyer().setOrgNo(EmptyStringUtil.stringToEmpty(buyId));
		//bill.getBuyName().setOrgName(EmptyStringUtil.stringToEmpty(buyName));
		bill.setBuyCardNo(EmptyStringUtil.stringToEmpty(buyCardNo));
		bill.setMeatTypeID(EmptyStringUtil.integerToEmpty(meatTypeID));

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

	public static List<Bill> getBillList(String xml) {
		String parseXML = xml;
		
		List<Bill> billList = null;
		BillDigest helper;

		Digester digester = new Digester();
		digester.setValidating(false);
		
		digester.addObjectCreate("document", "org.mcp.data.logic.BillDigest");
		digester.addCallMethod("document/bill", "addBillList", 14);
		digester.addCallParam("document/bill/a", 0);
		digester.addCallParam("document/bill/b", 1);
		digester.addCallParam("document/bill/c", 2);
		digester.addCallParam("document/bill/d", 3);
		digester.addCallParam("document/bill/e", 4);
		digester.addCallParam("document/bill/f", 5);
		digester.addCallParam("document/bill/g", 6);
		digester.addCallParam("document/bill/h", 7);
		digester.addCallParam("document/bill/i", 8);
		digester.addCallParam("document/bill/j", 9);
		digester.addCallParam("document/bill/k", 10);
		digester.addCallParam("document/bill/l", 11);
		digester.addCallParam("document/bill/m", 12);
		digester.addCallParam("document/bill/n", 13);
		
		digester.addCallMethod("document/bill/billItem", "addBillItem", 5);
		digester.addCallParam("document/bill/billItem/ia", 0);
		digester.addCallParam("document/bill/billItem/ib", 1);
		digester.addCallParam("document/bill/billItem/ic", 2);
		digester.addCallParam("document/bill/billItem/id", 3);
		digester.addCallParam("document/bill/billItem/ie", 4);
		
		try {
			helper = (BillDigest)digester.parse(new StringReader(parseXML));
			billList = helper.getBillList();
		}catch (Exception e) {
			e.printStackTrace();
			billList = null;
		}
		return billList;
	}
	
		
	public void addBill(Bill bill) {
		initBillList();
				bill.setTriger(8);
		billList.add(bill);
	}
	
	public static List<Bill> getBillListRZ(String xml) {
		List<Bill> billList = null;
		BillDigest helper;
		
		Digester digester = new Digester();
        digester.setValidating(false);
// 指明匹配模式和要创建的类          
        digester.addObjectCreate("sell", BillDigest.class );
        digester.addObjectCreate("sell/bill", Bill.class );
        digester.addSetProperties("sell/bill", "ss", "billType");
// 设置对象属性,与xml文件对应        
        digester.addBeanPropertySetter("sell/bill/sn", "serialNo");
        digester.addBeanPropertySetter("sell/bill/sd", "saleDate");
        digester.addBeanPropertySetter("sell/bill/bt", "incoming");
        digester.addBeanPropertySetter("sell/bill/oc", "supId");
        digester.addBeanPropertySetter("sell/bill/on", "supName");
        
        digester.addBeanPropertySetter("sell/bill/pc", "buyId");
        digester.addBeanPropertySetter("sell/bill/pn", "buyName");
        digester.addBeanPropertySetter("sell/bill/pd", "buyCardNo");
        
        digester.addBeanPropertySetter("sell/bill/ts", "totalCount");
        digester.addBeanPropertySetter("sell/bill/tz", "totalWeight");
        digester.addBeanPropertySetter("sell/bill/ta", "totalMoney");
        
        digester.addObjectCreate("sell/bill/item", BillItem.class );
        digester.addBeanPropertySetter("sell/bill/item/cn", "variety");
        digester.addBeanPropertySetter("sell/bill/item/tw", "weight");
        digester.addBeanPropertySetter("sell/bill/item/tp", "price");
        digester.addBeanPropertySetter("sell/bill/item/tt", "total");
        
        digester.addBeanPropertySetter("sell/bill/item/bn", "code");
// 当移动到下一个标签中时的动作        
        digester.addSetNext("sell/bill/item", "addItem");
        digester.addSetNext("sell/bill", "addBill");

        try {
			helper = (BillDigest)digester.parse(new StringReader(xml));
			billList = helper.getBillList();
		}catch (Exception e) {
			e.printStackTrace();
			billList = null;
		}
		return billList;
	}
}

 

 

(1)方法 getBillList(String xml) 为第一种方式

    使用addCallMethod方法,映射XML所对应的节点与这个Call method的参数即可,这个call method将读取的一个标签内所有的值存入对象,然后再存入一个集合中.

 

(2)方法 getBillListRZ(String xml) 为第二种方式

    使用addObjectCreate方法,创建对象映射XML文件的属性对java Bean. 读取完一个对象将对象加入到一个集合中,然后再读取XML文件的下一个标签

 

 

分享到:
评论

相关推荐

    java反射,Digester解析xml文档

    Digester通过匹配XML元素结构来调用对象的方法或创建新对象,减少了手动解析XML的复杂性。这在配置驱动的Java应用中非常常见,如Spring框架的早期版本。使用Digester的基本流程包括: 1. **定义XML规则**:在 ...

    digester解析xml

    《digester解析XML详解》 在Java开发中,XML作为一种数据交换格式,广泛应用于配置文件、数据传输等场景。为了方便地将XML文档解析为Java对象,Apache组织提供了一个名为Digester的工具库,它允许开发者通过规则来...

    Digester两种解析方式

    Digester提供了两种主要的解析方式,即规则硬编码和独立的规则文件,这两种方法各有其特点和适用场景。 1. 规则硬编码: 在硬编码方式中,开发者直接在代码中创建和设置Digester的规则。这些规则定义了如何处理XML...

    xml解析commons-digester的demo

    这个示例演示了如何使用Apache Commons Digester解析XML文件,将XML数据转换为Java对象。通过定义规则,我们可以轻松地处理复杂的XML结构,并将它们映射到Java对象模型中。这在处理大量配置数据或需要从XML文件加载...

    digester包

    使用digester解析XML时,我们需要遵循以下步骤: 1. **初始化Digester**:创建一个Digester实例,并设置必要的属性,如命名空间处理、错误处理等。 2. **定义Rule**:创建Rule对象,这些对象定义了当XML文档中的...

    digester jar 包

    在Java中,解析XML文件通常有两种主要方法:DOM(Document Object Model)和SAX(Simple API for XML)。DOM将整个XML文档加载到内存中,形成一个树形结构,便于遍历和修改;而SAX是一种事件驱动模型,只读且逐行...

    关于XML文档的解析方法

    本文将深入探讨XML文档的解析方法,主要包括DOM(Document Object Model)和SAX(Simple APIs for XML)两种主要的解析策略。 DOM是W3C制定的一种标准接口,它将XML文档转换为一棵节点树,每个节点代表XML文档的一...

    xml解析在java中的应用小程序

    XML解析主要分为两种方式:DOM(Document Object Model)和SAX(Simple API for XML)。DOM解析器会将整个XML文档加载到内存中,形成一个树形结构,便于遍历和操作。这种方式适合小规模的XML文档,但对大文件可能会...

    digester学习笔记

    4. **解析XML**:最后,使用`digester.parse()`方法解析XML文档,完成后,栈顶的对象通常是解析结果的根节点。 在提供的示例中,有两个JavaBean,Foo和Bar。Foo有一个名为addBar的方法,用于添加Bar对象,而Bar包含...

    commons-digester-2.0.rar源文件及jar文件

    1. `digester.jar`:这是核心库,包含了所有必要的类和方法,用于解析XML并执行相应的操作。 2. `LICENSE.txt`和`NOTICE.txt`:这两个文件分别包含了Apache软件基金会的许可协议和版权信息,用户在使用时应遵循其中...

    velocity+digester+java

    **Digester** 是Apache Commons项目的一个组件,主要用来解析XML文档并根据预定义的规则进行对象创建和配置。它的工作原理类似于一个XML到Java对象的映射器,通过对XML结构化数据的匹配规则,自动执行相应的操作,如...

    xml解析

    XML解析主要分为两种方式:DOM(Document Object Model)和SAX(Simple API for XML)。 1. **DOM解析**:将整个XML文档加载到内存中,形成一棵元素树。每个节点代表XML文档的一部分,可以随时访问和修改。这种方式...

    java操作xml相关jar

    9. **Apache Commons Digester**:这个Apache项目提供了一种规则驱动的方法来从XML创建Java对象,简化了XML到Java对象的映射过程。 10. **JAXB2 Basics**:这个扩展库为JAXB提供了更多实用功能,如注解处理器和转换...

    xml 解析例子

    这个过程分为两种主要类型:DOM(Document Object Model)解析和SAX(Simple API for XML)解析。 1. DOM解析: DOM解析器将整个XML文档加载到内存中,创建一个树形结构,称为DOM树。每个元素、属性、文本节点都在...

    Java常用工具类,字符串、日期、jdbc、xml解析等等

    - `SAXParser`和`DOMParser`:两种不同的解析策略,SAX是事件驱动的,适用于大文件;DOM是基于树结构的,适用于小文件。 - `JAXB`(Java Architecture for XML Binding):用于对象到XML的自动转换。 - `XMLUtils...

    Java XML读取信息到数据库

    首先,我们需要了解Java中解析XML的两种主要方法:DOM(Document Object Model)和SAX(Simple API for XML)。DOM一次性加载整个XML文件,形成一个树形结构,适合小规模的XML处理。SAX则采用事件驱动的方式,逐行...

    java生成复杂xml操作

    除了DOM,Java还提供了另外两种处理XML的方法:SAX(Simple API for XML)和StAX(Streaming API for XML)。SAX是基于事件驱动的解析器,适用于处理大型XML文件,因为它不会将整个文档加载到内存中。而StAX则允许...

    commons-digester.jar commons-dbcp.jar

    通过定义一系列规则,你可以控制如何将XML元素映射到Java对象的属性,这样就可以避免手动解析XML并创建对象的繁琐过程。 接下来,`commons-dbcp-1.2.2.jar`是Apache Commons Database Connection Pooling(DBCP)的...

    xbean,xmlpublic,xml-apis等jar

    XBean通过Apache Commons Digester和Xerces来解析XML配置文件,并将其转换为Java对象。这个框架主要用于简化复杂配置文件的处理,尤其是在Spring框架中,XBean可以作为一个扩展,帮助处理XML配置文件。它支持动态...

Global site tag (gtag.js) - Google Analytics