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 ...
随机推荐
- 基于Verilog语言的可维护性设计技术
[注]本文内容主体部分直接翻译参考文献[1]较多内容,因此本文不用于任何商业目的,也不会发表在任何学术刊物上,仅供实验室内部交流和IC设计爱好者交流之用. “曲意而使人喜,不若直节而使人忌:无善而致人 ...
- 8. java操作mongodb——查询数据
转自:https://www.cnblogs.com/adjk/p/6430074.html 通过find方法查询集合中的文档信息 ---------------------------------- ...
- 如何更改AD域安全策略-密码必须符合复杂性要求
通常我们在域系统-管理工具上面是找不到“域安全策略”的,我们只能找到“本地安全策略”,而更改“本地安全策略”是不会对域产生任何的作用的.下面这个步骤教你如何找到“域安全策略” 1.Start(开始)– ...
- node.学习笔记(关于http2的讲解)
个人总结:读完这篇文章需要30分钟 http2部分很有学习价值,可以好好看. 用node搭建TCP服务器 用node搭建HTTP服务器 用node文件fs模块对文件读取,并用流的方式写入 用url路 ...
- 关于【搭建LAMP环境时,php测试页面打不开】解决
关于[搭建LAMP环境时,php测试页面打不开]解决 〇.我的测试页面是: http://172.30.124.10/index.php 用火狐打不开,如下图. 一.httpd已经启动了(system ...
- C++ lambda表达式 (二)
#include <functional> #include <iostream> int main() { using namespace std; int i = 3; i ...
- 【v2.x OGE教程 12】 关卡编辑器帮助文档
] 关卡编辑器帮助文档 一.简单介绍 关卡编辑器用于游戏关卡界面元素的可视化编辑,包含元素的位置.尺寸以及其他自己定义属性.通过解析生成的数据文件就可以获取关卡信息,并能随时调整.以降低开发工作量,提 ...
- Android自己定义效果——随机抽奖
那天逛android开源码的时候,看到一个wheel menu的自己定义效果,就是类似人家的那种转盘抽奖,把人家project看了下.认为非常好玩.可是不想在他上面改,于是就自己想了一个类似的随即抽奖 ...
- vim 基础学习之插入模式
插入模式1.字符编码,插入特殊字符 <C-v>{3位} 如,你想输入A,你可以在输入模式下<C-v>065(必须是3位) <C-v>u{4位} 如,你想输入¿,你可 ...
- 企业实战之部署Solarwinds Network八部众
企业实战之部署Solarwinds Network 网管系统八部众 Orion Network Performance Monitor是全面的带宽性能监控和故障管理软件,能监控并收集来自路由器.交换机 ...