上传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数据文件上传至数据库的更多相关文章

  1. SpringMVC——返回JSON数据&&文件上传下载

    --------------------------------------------返回JSON数据------------------------------------------------ ...

  2. Dreamer 3.0 支持json、xml、文件上传

    自己写的框架,功能类似Struts2.x 下载地址:http://pan.baidu.com/share/link?shareid=3273223286&uk=470382596 新增功能: ...

  3. 混合表单文件上传到数据库(基于TOMCAT)

    在实际的开发中在实现文件上传的同时肯定还有其他信息需要保存到数据库,就像混合表单在上传完毕之后需要将提交的基本信息插入数据库. 在这个demo中需要用到这个架包来帮助实现 1.定义一个公共类实现文件上 ...

  4. 一个简单的excel文件上传到数据库方法

    因为以前项目中有用到过Excel导入,所以整理了一下,这是一个导入Excel数据到数据库的方法 注意:需要导入poi jar包 代码清单 /** * Excel 导入 * @param mapping ...

  5. springMVC+spring+hibernate注解上传文件到数据库,下载,多文件上传

    数据库 CREATE TABLE `annex` ( `id` bigint() NOT NULL AUTO_INCREMENT, `realName` varchar() DEFAULT NULL, ...

  6. springMVC文件上传(转)

    原文链接: http://www.cnblogs.com/lonecloud/p/5989905.html 在Spring-mvc.xml注入bean 1 <!-- 配置文件上传,如果没有使用文 ...

  7. [iOS 多线程 & 网络 - 2.5] - 小文件上传

    A.文件上传 思路: 发送文件数据给服务器 使用post请求 必须手动设置请求头: 内容大小Content-Length & 内容类型 Content-Type 请求体:文件数据 文件上传的格 ...

  8. 用Express、MySQL搭建项目(接口以及静态文件获取、文件上传等)

    一.简介 本文将主要基于node.js使用express框架搭建一个后台环境,包括如何自定义项目目录.所用依赖以及中间件.路由以及模板引擎.接口数据获取以及文件上传等内容. 二.后台环境搭建 1.新建 ...

  9. SpringMVC 文件上传下载

    目录 文件上传 MultipartFile对象 文件下载 上传下载示例 pom.xml增加 创建uploadForm.jsp 创建uploadForm2.jsp 创建userInfo.jsp spri ...

随机推荐

  1. 判断DataGridView滚动条是否滚动到当前已加载的数据行底部

    private void dataGridView1_Scroll(object sender, ScrollEventArgs e) {   if (e.ScrollOrientation == S ...

  2. HDU 4349 Xiao Ming's Hope 组合数学

    题意:给你n,问在C(n,1),C(n,2)...C(n,n)中有多少个奇数. 比赛的时候打表看出规律,这里给一个数学上的说明. Lucas定理:A,B非负整数,p是质数,A,B化为p进制分别为a[n ...

  3. gym 100735I

    Description standard input/outputStatements You are given three numbers. Is there a way to replace v ...

  4. Tensorflow 函数学习笔记

    A: A:## tf.argmax(A, axis).eval() 输出axis维度上最大的数的索引 axis=0:列,axis=1:行 A:## tf.add(a,b)  创建a+b的计算图 A:# ...

  5. U-BOOT启动流程分析--start.s(二)

    一.概述 u-boot的启动流程: 从文件层面上看主要流程是在两个文件中:cpu/arm920t/start.s,lib_arm/board.c, 先来分析start.s    在flash中执行的引 ...

  6. scrapy框架中间件配置代理

    scrapy框架中间件配置代理import random#代理池PROXY_http = [ '106.240.254.138:80', '211.24.102.168:80',]PROXY_http ...

  7. Mysql学习总结(10)——MySql触发器使用讲解

    触发器(TRIGGER)是由事件来触发某个操作.这些事件包括INSERT语句.UPDATE语句和DELETE语句.当数据库系统执行这些事件时,就会激活触发器执行相应的操作.MySQL从5.0.2版本开 ...

  8. iOS 平台上常见的安装包有三种,deb、ipa 和 pxl

    前言:目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl. 其中 deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式,配合 APT 软件管理系统 ...

  9. 61.node.js开发错误——Error: Connection strategy not found

    转自:https://blog.csdn.net/fd214333890/article/details/53457145

  10. vue -- 跨域cookie 丢失的问题

    前端使用了vue-reource的$http进行请求后台接口 登陆完成后,服务端监控发现无法拿到cookie,下面看几张前端控制台监控的图 reqqust Header  没有显示cookie 信息 ...