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 ...
随机推荐
- 记一次struts2漏洞修复带来的问题
struts2作为万年漏洞王,感觉已经被弃如敝屣了,除了一些古老的项目,比如我手上的一个项目,以前每次出现漏洞就如临大敌,手忙脚乱的赶在公司红头文件发出来前修复它.然后改了一两次后毅然决然用别的框架代 ...
- Windows 7: Update is not applicable to your computer
https://www.sevenforums.com/windows-updates-activation/119088-update-not-applicable-your-computer.ht ...
- 123.static静态函数和函数模板
#include <iostream> using namespace std; //static成员,每个类型都会实例化,创建一个变量,类型一致则共享,否则不共享 template &l ...
- 99.重载[] * -> ->*
#include "mainwindow.h" #include <QApplication> #include <QPushButton>> //重 ...
- How Blink works
How Blink works Author: haraken@ Last update: 2018 Aug 14 Status: PUBLIC Working on Blink is not eas ...
- [Chromium文档转载,第003章]Proposal: Mojo Synchronous Methods
Proposal: Mojo Synchronous Methods yzshen@chromium.org 02/02/2016 Overview Currently there are quite ...
- nvm安装node流程及报错解决
第一步:下载NVM下载nvm并解压 nvm-window 下载地址:https://github.com/coreybutler/nvm-windows/releases 下载文件,然后解压得到nvm ...
- 学习推荐《Python神经网络编程》中文版PDF+英文版PDF+源代码
推荐非常适合入门神经网络编程的一本书<Python神经网络编程>,主要是三部分: 介绍神经网络的基本原理和知识:用Python写一个神经网络训练识别手写数字:对识别手写数字的程序的一些优化 ...
- HBase概念学习(八)开发一个类twitter系统之表设计
这边文章先将可能的需求分析一下,设计出HBase表,下一步再開始编写client代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,參考HBase实战这本书实际动手做了这个样例. ...
- java导入大量Excel时报错
在项目中同事遇到一问题,如今给大家分享一下. 在程序里面导入两千多条数据后.程序就报错. 刚開始以为是内存的问题.在经过细致跟踪代码后发现每次都是833行的第三列报错.也就是第一万列.最后在网上找到了 ...