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对象。