xml数据文件上传至数据库
上传xml文件数据到数据库思路:首先上传需要建校验xml字段的校验文件,然后程序根据后台写好的xml数据文件路径自动读取数据文件,再上传数据文件到数据库之前先根据校验文件校验上传的数据文件的字段是否合法,进行判断。
前台页面 /WEB-INF/jsp/test/uploadExcel.jsp
<form id="uploadAuditedFileForm" action="../upload/uploadAuditedXML"
method="post" enctype="multipart/form-data">
<input id="uploadAuditedFile" type="file" name="file"
onchange="javascript:CheckAuditedFileType()" /> <input
id="uploadAuditedBtn" type="submit" disabled="disabled"
value="上传引擎审核结果文件" />
</form>
后台代码
@Controller
@RequestMapping(value = "/upload")
public class UploadSaleDataAction类
@RequestMapping(value = "/uploadAuditedXML")
public String uploadAuditedXML(@RequestParam(value = "file", required = false) MultipartFile file,
HttpServletRequest request, ModelMap model) {
String path = UPLOAD_DIR + File.separator;
String fileName = file.getOriginalFilename();
fileName = "Audited.xml"; File targetFile = new File(path, fileName); if (!targetFile.exists()) {
targetFile.mkdirs();
} // 保存
try {
file.transferTo(targetFile);
System.out.println(targetFile.getPath());
} catch (Exception e) {
e.printStackTrace();
} engineResult.storeEngineResultToSamsDb(); return GO_UPLAODEXCEL;
}
}
校验xml文件 StoreEngineResult类
/**
* 将引擎输出结果存储到销售审核数据库中
*/
public void storeEngineResultToSamsDb() {
// 通过xsd文件验证xml文件合法性
if (!parse.validateXMLByXSD("/usr/app/saleData/Audited.xml", "/usr/app/saleData/engineoutput.xsd")) {
log.error("验证失败!");
return;
} parse.parseAuditedXML("/usr/app/saleData/Audited.xml");
}
解析xml类
@Component
public class ParseXML
/**
* 通过XSD(XML Schema)校验XML
*
* @return
*/
public boolean validateXMLByXSD(String xmlPath, String xsdPath) {
// xmlPath = "D:\\xmltest\\source\\TRANSACTION\\test.xml";
// xsdPath = "D:\\xmltest\\validator\\test.xsd";
boolean flag = false;
try {
// 创建默认的XML错误处理器
XMLErrorHandler errorHandler = new XMLErrorHandler();
// 获取基于 SAX 的解析器的实例
SAXParserFactory factory = SAXParserFactory.newInstance();
// 解析器在解析时验证 XML 内容。
factory.setValidating(true);
// 指定由此代码生成的解析器将提供对 XML 名称空间的支持。
factory.setNamespaceAware(true);
// 使用当前配置的工厂参数创建 SAXParser 的一个新实例。
SAXParser parser = factory.newSAXParser();
// 创建一个读取工具
SAXReader xmlReader = new SAXReader();
// 获取要校验xml文档实例
Document xmlDocument = (Document) xmlReader.read(new File(xmlPath));
// 设置 XMLReader 的基础实现中的特定属性。核心功能和属性列表可以在
// [url]http://sax.sourceforge.net/?selected=get-set[/url] 中找到。
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "file:"
+ xsdPath);
// 创建一个SAXValidator校验工具,并设置校验工具的属性
SAXValidator validator = new SAXValidator(parser.getXMLReader());
// 设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。
validator.setErrorHandler(errorHandler);
// 校验
validator.validate(xmlDocument); XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
// 如果错误信息不为空,说明校验失败,打印错误信息
if (errorHandler.getErrors().hasContent()) {
System.out.println("XML文件通过XSD文件校验失败!");
writer.write(errorHandler.getErrors()); log.error("XML文件通过XSD文件校验失败!");
log.error(errorHandler.getErrors().asXML());
return flag;
}
flag = true;
} catch (Exception ex) {
log.error("XML文件: " + xmlPath + " 通过XSD文件:" + xsdPath + "检验失败。\n原因: " + ex.getMessage());
System.out.println("XML文件: " + xmlPath + " 通过XSD文件:" + xsdPath + "检验失败。\n原因: "
+ ex.getMessage());
}
return flag;
}
校验成功后开始解析xml数据文件
/**
* 解析XML
*
* @param xmlPath
* @return
* @throws Exception
*/
public void parseAuditedXML(String xmlPath) {
try {
Element root = read(xmlPath).getRootElement();
for (Iterator<?> transactions = root.elementIterator("TRANSACTION"); transactions
.hasNext();) {
Element transactionElement = (Element) transactions.next();
for (Iterator<?> ticketsElement = transactionElement
.elementIterator("AUDITEDTICKET"); ticketsElement.hasNext();) {
Element ticketElement = (Element) ticketsElement.next();
AuditedTicketEngineOut auditedTicket = new AuditedTicketEngineOut();
auditedTicket = setTicketInfo(ticketElement, auditedTicket);
ticketService.saveEngineAuditOut(auditedTicket);
}
}
} catch (DocumentException e) {
e.printStackTrace();
log.error("解析文件失败!");
}
}
将解析的元素添加到对象中
/**
* Ticket对象设值
*
* @param ticketElement
* @param ticket
* @throws ParseException
*/
@SuppressWarnings("finally")
private AuditedTicketEngineOut setTicketInfo(Element ticketElement,
AuditedTicketEngineOut auditedTicket) {
try {
auditedTicket.setTktNo(getText(ticketElement.element("TKT_NO")) == null ? null
: getText(ticketElement.element("TKT_NO"))); // auditedTicket
// .setEngineRefAuditDate(getText(ticketElement.element("ENGINE_REF_AUDIT_DATE")) == null ? null
// : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
// .parse(getText(ticketElement.element("ENGINE_REF_AUDIT_DATE"))
// .contains("T") == false ? getText(ticketElement
// .element("ENGINE_REF_AUDIT_DATE")) : getText(
// ticketElement.element("ENGINE_REF_AUDIT_DATE"))
// .replace("T", " ")));
auditedTicket.setEngineRefAuditDate(getText(ticketElement
.element("ENGINE_REF_AUDIT_DATE")) == null ? null : new SimpleDateFormat(
"yyyy/MM/dd HH:mm:ss").parse(getText(ticketElement
.element("ENGINE_REF_AUDIT_DATE")) == null ? null : getText(ticketElement
.element("ENGINE_REF_AUDIT_DATE"))));
auditedTicket
.setFareRefAmt(getText(ticketElement.element("FARE_REF_AMT")) == null ? null
: new BigDecimal(getText(ticketElement.element("FARE_REF_AMT")))); auditedTicket
.setCommCalBase(getText(ticketElement.element("COMM_CAL_BASE")) == null ? null
: getText(ticketElement.element("COMM_CAL_BASE")));
auditedTicket
.setCommRateRefAmt(getText(ticketElement.element("COMM_RATE_REF_AMT")) == null ? null
: new BigDecimal(getText(ticketElement.element("COMM_RATE_REF_AMT"))));
auditedTicket
.setCommRefAmt(getText(ticketElement.element("COMM_REF_AMT")) == null ? null
: new BigDecimal(getText(ticketElement.element("COMM_REF_AMT")))); auditedTicket.setTaxRefAmt(getText(ticketElement.element("TAX_REF_AMT")) == null ? null
: new BigDecimal(getText(ticketElement.element("TAX_REF_AMT"))));
auditedTicket
.setRefundFeeRefAmt(getText(ticketElement.element("REFUNDFEE_REF_AMT")) == null ? null
: new BigDecimal(getText(ticketElement.element("REFUNDFEE_REF_AMT"))));
// auditedTicket
// .setExchangeFeeRefAmt(getText(ticketElement.element("EXCHANGEFEE_REF_AMT")) == null ? null
// : new BigDecimal(getText(ticketElement.element("EXCHANGEFEE_REF_AMT")))); auditedTicket
.setFareErrorCode(getText(ticketElement.element("FARE_ERROR_CODE")) == null ? null
: getText(ticketElement.element("FARE_ERROR_CODE")));
auditedTicket
.setCommErrorCode(getText(ticketElement.element("COMM_ERROR_CODE")) == null ? null
: getText(ticketElement.element("COMM_ERROR_CODE")));
auditedTicket
.setTaxErrorCode(getText(ticketElement.element("TAX_ERROR_CODE")) == null ? null
: getText(ticketElement.element("TAX_ERROR_CODE")));
auditedTicket
.setFareAuditMode(getText(ticketElement.element("FARE_AUDIT_MODE")) == null ? null
: getText(ticketElement.element("FARE_AUDIT_MODE")));
auditedTicket
.setCommAuditMode(getText(ticketElement.element("COMM_AUDIT_MODE")) == null ? null
: getText(ticketElement.element("COMM_AUDIT_MODE")));
auditedTicket
.setTaxAuditMode(getText(ticketElement.element("TAX_AUDIT_MODE")) == null ? null
: getText(ticketElement.element("TAX_AUDIT_MODE")));
auditedTicket
.setEngRuleOldResult(getText(ticketElement.element("ENG_RULE_OLDRESULT")) == null ? null
: getText(ticketElement.element("ENG_RULE_OLDRESULT")));
auditedTicket = parseTicketChildNode(ticketElement, auditedTicket);
} catch (ParseException e) {
e.printStackTrace();
} finally {
return auditedTicket;
}
}
添加ticket下的子标签元素
/**
* 解析TICKET标签下的子标签对象
*
* @param ticketElement
* @param ticket
* @throws ParseException
*/
private AuditedTicketEngineOut parseTicketChildNode(Element ticketElement,
AuditedTicketEngineOut auditedTicket) {
List<AuditedSector> sectors = setSectorInfo(ticketElement);
List<AuditedFareComponent> fareComponents = setFareComponetInfo(ticketElement);
List<AuditedTicketTax> ticketTaxs = setTicketTaxInfo(ticketElement);
List<AuditedCouponTax> couponTaxs = setCouponTaxInfo(ticketElement);
auditedTicket.setAuditedSectors(sectors);
auditedTicket.setAuditedCouponTaxs(couponTaxs);
auditedTicket.setAuditedFareComponents(fareComponents);
auditedTicket.setAuditedTicketTaxs(ticketTaxs);
return auditedTicket;
}
添加子元素,其他子元素以此类推
/**
* Sector对象设值
*
* @param ticketElement
* @return
* @throws ParseException
*/
private List<AuditedSector> setSectorInfo(Element ticketElement) {
List<AuditedSector> sectors = new ArrayList<AuditedSector>();
for (Iterator<?> sectorsElement = ticketElement.elementIterator("AUDITEDSECTOR"); sectorsElement
.hasNext();) {
Element sectorElement = (Element) sectorsElement.next();
AuditedSector sector = new AuditedSector();
sector.setTktNo(getText(sectorElement.element("TKT_NO")) == null ? null
: getText(sectorElement.element("TKT_NO"))); sector.setCpnNo(getText(sectorElement.element("CPN_NO")) == null ? null : Long
.parseLong(getText(sectorElement.element("CPN_NO")))); sector.setRfdFeeRefAmt(getText(sectorElement.element("CHANGEFEE_REF_AMT")) == null ? null
: new BigDecimal(getText(sectorElement.element("CHANGEFEE_REF_AMT"))));
sectors.add(sector);
} return sectors;
}
然后保存引擎输入结果
/*
* 保存引擎输出结果
*/
@Override
@Transactional
public void saveEngineAuditOut(AuditedTicketEngineOut auditedTicketEngineOut) {
Ticket ticket = this.findTicketByTktNo(auditedTicketEngineOut.getTktNo()); if (ticket != null) {
convertTicket(auditedTicketEngineOut, ticket); if ("N".equals(ticket.getTicketBasicSale().getSaleType())) {
NormalTicket normal = (NormalTicket) ticket;
normal.setFciFareComponents(convertFareComponet(normal.getFciFareComponents(),
auditedTicketEngineOut));
normal.setTaxs(convertTicketTax(normal.getTaxs(), auditedTicketEngineOut));
normal.setCouponTaxs(convertCouponTax(normal.getCouponTaxs(),
auditedTicketEngineOut));
normal.setFciSectors(convertFciSector(normal.getFciSectors(),
auditedTicketEngineOut)); ticketDao.updateNormalTicket(normal);
} else if ("E".equals(ticket.getTicketBasicSale().getSaleType())) {
ExchangeTicket exchange = (ExchangeTicket) ticket;
exchange.setFciFareComponents(convertFareComponet(exchange.getFciFareComponents(),
auditedTicketEngineOut));
exchange.setTaxs(convertTicketTax(exchange.getTaxs(), auditedTicketEngineOut));
exchange.setCouponTaxs(convertCouponTax(exchange.getCouponTaxs(),
auditedTicketEngineOut));
exchange.setFciSectors(convertFciSector(exchange.getFciSectors(),
auditedTicketEngineOut)); AuditInfo changeFeeInfo = exchange.getChangeFeeInfo();
changeFeeInfo.setRefAmt(auditedTicketEngineOut.getExchangeFeeRefAmt()); // EXCHANGEFEE_REF_AMT
exchange.setChangeFeeInfo(changeFeeInfo); ticketDao.updateExchangeTicket(exchange);
} else if ("R".equals(ticket.getTicketBasicSale().getSaleType())) {
RefundTicket refund = (RefundTicket) ticket;
refund.setTaxs(convertTicketTax(refund.getTaxs(), auditedTicketEngineOut));
refund.setCouponTaxs(convertCouponTax(refund.getCouponTaxs(),
auditedTicketEngineOut));
refund.setFciSectors(convertFciSector(refund.getFciSectors(),
auditedTicketEngineOut)); AuditInfo refundFeeInfo = refund.getRefundFeeInfo();
refundFeeInfo.setRefAmt(auditedTicketEngineOut.getRefundFeeRefAmt());// REFUNDFEE_REF_AMT
refund.setRefundFeeInfo(refundFeeInfo); ticketDao.updateRefundTicket(refund);
}
}
}
创建的xml数据文件和xsd校验文件
附录
检验文件
数据文件xml
xml数据文件上传至数据库的更多相关文章
- SpringMVC——返回JSON数据&&文件上传下载
--------------------------------------------返回JSON数据------------------------------------------------ ...
- Dreamer 3.0 支持json、xml、文件上传
自己写的框架,功能类似Struts2.x 下载地址:http://pan.baidu.com/share/link?shareid=3273223286&uk=470382596 新增功能: ...
- 混合表单文件上传到数据库(基于TOMCAT)
在实际的开发中在实现文件上传的同时肯定还有其他信息需要保存到数据库,就像混合表单在上传完毕之后需要将提交的基本信息插入数据库. 在这个demo中需要用到这个架包来帮助实现 1.定义一个公共类实现文件上 ...
- 一个简单的excel文件上传到数据库方法
因为以前项目中有用到过Excel导入,所以整理了一下,这是一个导入Excel数据到数据库的方法 注意:需要导入poi jar包 代码清单 /** * Excel 导入 * @param mapping ...
- springMVC+spring+hibernate注解上传文件到数据库,下载,多文件上传
数据库 CREATE TABLE `annex` ( `id` bigint() NOT NULL AUTO_INCREMENT, `realName` varchar() DEFAULT NULL, ...
- springMVC文件上传(转)
原文链接: http://www.cnblogs.com/lonecloud/p/5989905.html 在Spring-mvc.xml注入bean 1 <!-- 配置文件上传,如果没有使用文 ...
- [iOS 多线程 & 网络 - 2.5] - 小文件上传
A.文件上传 思路: 发送文件数据给服务器 使用post请求 必须手动设置请求头: 内容大小Content-Length & 内容类型 Content-Type 请求体:文件数据 文件上传的格 ...
- 用Express、MySQL搭建项目(接口以及静态文件获取、文件上传等)
一.简介 本文将主要基于node.js使用express框架搭建一个后台环境,包括如何自定义项目目录.所用依赖以及中间件.路由以及模板引擎.接口数据获取以及文件上传等内容. 二.后台环境搭建 1.新建 ...
- SpringMVC 文件上传下载
目录 文件上传 MultipartFile对象 文件下载 上传下载示例 pom.xml增加 创建uploadForm.jsp 创建uploadForm2.jsp 创建userInfo.jsp spri ...
随机推荐
- IBM软件技术峰会归来
为期两天在北京国际饭店会议中心的IBM软件技术峰会已近结束,此次大会最大的收获是能和沃森实验室的王博士沟通探讨人工智能软件的发展问题.领略到IBM 云计算首席架构师Jason R.McGee如何呼风唤 ...
- angular实现简单的pagination分页组件
不想使用第三方库,只想使用一个分页器,那么就简单的实现一个,效果如下: 1.使用方式: <custom-pagination *ngIf="enterpriseList.length& ...
- 小米开源便签Notes-源码研究(1)-导出功能整体思路
NotesListActivity是入口Activity. 响应菜单事件,我的手机是"左键菜单".如果菜单项的ID是"R.id.menu_export_text" ...
- or in 、Object.keys()以及Object.getOwnPropertyNames有什么区别?
or in .Object.keys()以及Object.getOwnPropertyNames的区别 var obj= Object.create(parent, { b: { value: 2, ...
- Intellij IDEA使用指南(持续更新)(转)
一.项目层面 1.Java开发工具IntelliJ IDEA导入项目 http://jingyan.baidu.com/article/a17d52852118ac8098c8f2c1.html 2. ...
- 阿里云server改动MySQL初始password---Linux学习笔记
主要方法就是改动 MySQL依照文件以下的my.cnf文件 首先是找到my.cnf文件. # find / -name "my.cnf" # cd /etc 接下来最好是先备份my ...
- C# Excel文件导入操作
Excel文件导出的操作我们经经常使用到,可是讲一个Excel文档导入并显示到界面还是第一次用到. 以下简介下在C#下怎样进行Excel文件的导入操作. 首先加入两个引用 using System.I ...
- 如日中天的Uber到底是用什么开发语言做到的?
Uber将正在蓬勃发展的Go和Node.js这两个语言很好的融合到其系统上面来.Uber的站点可靠性project师Tom Croucher在近期于波兰举行的Node.js互动大会上详尽的对该公司所用 ...
- json和XML
发请求(url) 1.client ---------------->服务端 发送数据(Json/xml) < - ...
- view-activity跟控件在onkey事件上的传递关系
android 中Activity跟View对于键盘的监听,主要有以下几个方法 //按键按下 public boolean onKeyDown(int keyCode, KeyEvent event) ...