xml报文需求实战

文章目录

      • 1. 工具类
      • 2. 测试类
      • 3. 工具发送报文

为了大家快速理解报文解析是做什么的?
简单的给大家按照企业的解析思路,给大家做了一个需求实战的真实流程,解析的报文每个厂商都不一样,因此,我自己造了一个xml报文,但是解析过程都是一样的!

1. 工具类

package com.gblfy.test.util;import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
import java.util.ArrayList;
import java.util.List;public class XmlFileDealUtils {/*** 获取本地目录下的文件名** @param localPath 本地文件目录* @param fileName  本地文件名* @throws Exception*/public static void getLocalFileNme(String localPath, String fileName) throws Exception {List<String> fileNames = getCurrentDirAllFileList(localPath, fileName);System.out.println(fileNames.size());if (fileNames != null) {for (String ff : fileNames) {System.out.println("File name under directory : " + ff);// 5.解析指定目录下的指定xml报文文件analysisInputMsg(localPath, fileName);}}}/*** 解析本地xml文件** @param localPath* @param fileName* @throws Exception*/public static void analysisInputMsg(String localPath, String fileName) throws Exception {// 创建一个DocumentBuilderFactory的对象DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();// 创建一个DocumentBuilder的对象try {// 创建DocumentBuilder对象DocumentBuilder db = dbf.newDocumentBuilder();// 通过DocumentBuilder对象的parser方法加载books.xml文件到当前项目下
//		    Document document = db.parse("books.xml");Document document = db.parse("D:" + File.separator + "dd" + File.separator + "books20190222.xml");// 获取所有book节点的集合NodeList bookList = document.getElementsByTagName("book");// 通过nodelist的getLength()方法可以获取bookList的长度System.out.println("一共有" + bookList.getLength() + "本书");// 遍历每一个book节点for (int i = 0; i < bookList.getLength(); i++) {System.out.println("=================下面开始遍历第" + (i + 1) + "本书的内容=================");// 通过 item(i)方法 获取一个book节点,nodelist的索引值从0开始Node book = bookList.item(i);// 获取book节点的所有属性集合NamedNodeMap attrs = book.getAttributes();System.out.println("第 " + (i + 1) + "本书共有" + attrs.getLength() + "个属性");// 遍历book的属性for (int j = 0; j < attrs.getLength(); j++) {// 通过item(index)方法获取book节点的某一个属性Node attr = attrs.item(j);// 获取属性名System.out.print("属性名:" + attr.getNodeName());// 获取属性值System.out.println("--属性值" + attr.getNodeValue());}// 解析book节点的子节点NodeList childNodes = book.getChildNodes();// 遍历childNodes获取每个节点的节点名和节点值System.out.println("第" + (i + 1) + "本书共有" + childNodes.getLength() + "个子节点");for (int k = 0; k < childNodes.getLength(); k++) {// 区分出text类型的node以及element类型的nodeif (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {// 获取了element类型节点的节点名System.out.print("第" + (k + 1) + "个节点的节点名:" + childNodes.item(k).getNodeName());// 获取了element类型节点的节点值System.out.println("--节点值是:" + childNodes.item(k).getFirstChild().getNodeValue());// System.out.println("--节点值是:" + childNodes.item(k).getTextContent());}}System.out.println("======================结束遍历第" + (i + 1) + "本书的内容=================");}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 写请求报文至本地目录文件** @param localFilePath 文件的绝对路径* @param content       文件内容* @param encoding      文件内容编码* @throws IOException*/public static void write(String localFilePath, String fileNme, String content, String encoding) throws IOException {boolean flag = createDir(localFilePath);System.out.println("****" + flag);File file = new File(localFilePath + fileNme);file.delete();file.createNewFile();BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), encoding));writer.write(content);writer.close();}/*** 本地创建文件夹** @param destDirName* @return* @author gblfy*/public static boolean createDir(String destDirName) {File dir = new File(destDirName);if (!dir.exists()) {// 本地目录不存在创建dir.mkdirs();return true;}System.out.println("#本地目录已存在!:" + destDirName);return false;}/*** 遍历本地目录当前日期下面文件列表** @param localFilePath* @return* @throws Exception*/public static List<String> getCurrentDirAllFileList(String localFilePath, String fileName) throws Exception {List<String> list = new ArrayList<String>();// 获得指定目录下所有文件名File file = new File(localFilePath);File[] listFiles = null;listFiles = file.listFiles();if (listFiles != null && listFiles.length > 0) {for (File ff : listFiles) {if (ff.isFile() && ff.getName().equals(fileName)) {list.add(ff.getName());}}}return list;}/*** 本地保存报文** @param fileName* @param fileContext* @param writeTempFielPath* @return* @author guobin*/public static boolean saveLocal(String fileName, String fileContext, String writeTempFielPath) throws IOException {BufferedWriter bw = null;try {File f = new File(writeTempFielPath + File.separator + fileName);bw = new BufferedWriter(new FileWriter(f, true));bw.write(fileContext.replaceAll("\n", "\r\n"));bw.flush();return true;} catch (Exception e) {e.printStackTrace();System.out.println("#本地保存报文失败" + "[" + fileName + "]");} finally {bw.close();}return false;}/*** 根据当前日期生成文件备份子目录 传入格式:2018-11-16 返回格式:20181116** @param inputDate 日期* @return 字符串*/public static String getSubDir(String inputDate) {StringBuffer bufSubDir = new StringBuffer();bufSubDir.append(inputDate.substring(0, 4));bufSubDir.append(inputDate.substring(5, 7));bufSubDir.append(inputDate.substring(8, 10));return bufSubDir.toString();}}

2. 测试类

package com.sinosoft.fis.test.demo;import com.sinosoft.fis.test.util.XmlFileDealUtils;import java.io.File;/*** xml报文需求实战* <p>* 1.服务方接收 xml 文件。* 2.接收报文后,将文件写到指定目录。* 3.对本地的xml报文文件解析,取出每一个节点信息,进行数据落库操作。*/
public class WriteFileAnalysisInputMsg {/*** 根据需求,将请求报文,保存到本地* 1. 文件名日期格式处理* 2.拼接本地保存的文件名* 3.将接收的报文写到本地指定目录* 4.获取指定目录下的文件名* 5.解析指定目录下的指定xml报文文件*/public static void main(String[] args) throws Exception {//第三方发送的xml报文String content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + "<bookstore>\r\n"+ "    <book id=\"1\">\r\n" + "        <name>钢铁是怎样炼成的</name>\r\n" + "        <author>奥斯特洛夫斯基</author>\r\n"+ "        <year>2014</year>\r\n" + "        <price>89</price>\r\n" + "    </book>\r\n"+ "    <book id=\"2\">\r\n" + "        <name>安徒生童话</name>\r\n" + "        <year>2004</year>\r\n"+ "        <price>77</price>\r\n" + "        <language>English</language>\r\n" + "    </book>    \r\n"+ "</bookstore>";//1. 文件名日期格式处理String inputDate = "2019-02-22";inputDate = XmlFileDealUtils.getSubDir(inputDate);//2.拼接本地保存的文件名String fileName = "books" + inputDate + ".xml";String localFilePath = "D:" + File.separator + "dd" + File.separator;// 3.将接收的报文写到本地指定目录XmlFileDealUtils.write(localFilePath, fileName, content, "utf-8");// 4.获取指定目录下的文件名XmlFileDealUtils.getLocalFileNme(localFilePath, fileName);}
}

3. 工具发送报文

<?xml version="1.0" encoding="UTF-8"?>
<bookstore><book id="1"><name>钢铁是怎样炼成的</name><author>奥斯特洛夫斯基</author><year>2014</year><price>89</price></book><book id="2"><name>安徒生童话</name><year>2004</year><price>77</price><language>English</language></book>    
</bookstore>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云容器技术专家莫源:乘风踏雪归来,仍是此间少年

我叫刘中巍&#xff0c;花名莫源&#xff0c;是阿里云容器服务团队的技术专家&#xff0c;13年加入阿里云&#xff0c;从零开始参与多款云产品的研发。在1024开发者节之际&#xff0c;来分享下自己的成长故事。 “平凡但不安分”的男孩 我是一个来自北方的孩子&#xff0c;从小…

12306 的技术扒光在你面前,100 万人如何抢 1 万张票

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | IT牧场责编 | 阿秃12306 抢票&#xff0c;极限并发带来的思考每到节假日期间&#xff0c;一二线城市返乡、外出游玩的人们几乎都面临着一个问题&#xff1a;抢火车票&#xff01;虽然现在大多数情况下都能订到票&#xff0…

android monkey优化,GitHub - baozhida/AndroidMonkey: 这个项目是CrashMonkey4Android可执行文件,修复了一些bug,做了一些优化...

简介这个项目是CrashMonkey4Android可执行文件原版不支持64位java&#xff0c;只支持32位的此版本支持java 64位&#xff0c;并且修改了一些内部逻辑&#xff0c;把CrashMonkey4Android 和CrashMonkey4Android_tradefederation 重新打包2017-3-13更新1.去掉了每个monkey操作时候…

常见Serialize技术探秘(ObjectXXStream、XML、JSON、JDBC byte编码、Protobuf)

目前业界有各种各样的网络输出传输时的序列化和反序列化方案&#xff0c;它们在技术上的实现的初衷和背景有较大的区别&#xff0c;因此在设计的架构也会有很大的区别&#xff0c;最终在落地后的&#xff1a;解析速度、对系统的影响、传输数据的大小、可维护性及可阅读性等方面…

js数组查找最接近_在JavaScript数组中找到最小元素的位置

在JavaScript数组中找到最小元素的位置注* 之前有篇文章介绍过数据遍历的性能比较&#xff1a; for in 比for loop慢至少20倍 &#xff0c;这是另外一篇比较数组查找性能的例子&#xff0c;通过对手工/indexOf/reduce三者的比较&#xff0c;再次映证&#xff0c;内置函数不一下…

Mybatis Generator 配置详解

许多人在Java项目中都会到使用Mybatis Generator这个工具包&#xff0c;这里把这个工具的配置完整列一下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Gene…

MariaDB强势席卷DB-Engines榜单后续,与阿里云达成全球独家战略合作

2018年10月份&#xff0c;DB-Engines 发布了月全球数据库排名&#xff0c;排名前三的一如既往还是Oracle、MySQL、Microsoft SQL Server。排名是重要指标&#xff0c;同时增长率的重要性也同样备受重视。 MariaDB以黑马之势&#xff0c;强势席卷DB-Engines榜单 在DB-Engines跟…

html5怎么自动生成meta标签,html中meta标签该如何使用

为什么需要使用标签&#xff1f;在我们制作的网页中&#xff0c;要是想让它能够让更多的人去访问&#xff0c;最好的方法就是通过搜索引擎来找到你的网址&#xff0c;于是需要你的网页可以有关键词能够让搜索引擎来识别&#xff0c;于是HTML中的标签就是这个功能&#xff0c;将…

2025年将达6.4万亿美元!AI这下玩大了……

最近&#xff0c;在看大厂新季度财报时&#xff0c;发现了“搜狗”亮眼的成绩。就在前天&#xff0c;搜狗发布了2019年第三季度财报&#xff1a;营收3.149亿美元&#xff0c;实现14%的同比增长&#xff0c;高于行业增长速度。搜狗的净利润达3660万美元&#xff0c;比去年同期增…

存储系统设计——NVMe SSD性能影响因素一探究竟

目录 1 存储介质的变革 2 NVME SSD成为主流 2.1 NAND FLASH介质发展 2.2 软件层面看SSD——多队列技术 2.3 深入理解SSD硬件 3 影响NVME SSD的性能因素 3.1 GC对性能的影响 3.2 IO PATTERN对性能的影响 3.2.1 顺序写入Pattern对SSD性能优化的奥秘 3.2.2 读写冲突Patte…

教程 海湾主机crt_海湾消防主机JB-QT-GST5000火灾报警控制器(联动型)与crt是怎么联接编公式的...

联动公式是用来定义系统中报警设备与被控设备间联动关系的逻辑表达式。当系统中的探测设备报警或控制模块的状态发生变化时&#xff0c;控制器可按照这些逻辑表达式自动对被控设备执行“立即启动”或“延时启动”操作。本系统联动公式由等号分成前后两部分&#xff0c;前面为条…

使用IntelliJ IDEA 2020 高效开发 springboot项目

文章目录一、快速开发基础配置1. 全局配置2. maven3. 自动导入包4. 取消大小写敏感一、快速开发基础配置 前置知识&#xff1a; 有些时候明明都设置好了一些配置&#xff0c;但是新建项目之后&#xff0c;就恢复默认设置了&#xff0c;原因是你设置的配置支队你刚打开的这一个…

html实体转换成xa0,关于javascript:反应道具:在JSX动态内容中使用HTML实体?

我有一个React组件&#xff0c;我想为其道具分配一个包含JavaScript变量和HTML实体的字符串。我尝试过的一些方法导致HTML实体被转义。例如&#xff0c;从字面上呈现为" "而不是" –"。有没有办法让HTML实体在分配给React道具的JSX动态内容块中呈现为未转义…

基于Lucene查询原理分析Elasticsearch的性能

前言 Elasticsearch是一个很火的分布式搜索系统&#xff0c;提供了非常强大而且易用的查询和分析能力&#xff0c;包括全文索引、模糊查询、多条件组合查询、地理位置查询等等&#xff0c;而且具有一定的分析聚合能力。因为其查询场景非常丰富&#xff0c;所以如果泛泛的分析其…

首次落地中国大陆的OpenInfra:中国对于开源做出的贡献力量已不可忽视

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹责编 | 阿秃一张标志着上海现代建筑地标的东方明珠海报&#xff0c;另一张展示着上海悠久历史的豫园景区海报&#xff0c;不仅向我们展示了这座城市浓厚的历史气息与现代化的繁荣&#xff0c;也让我们看到了OpenStack历经…

java类验证和装载顺序_Java类的加载机制和双亲委派模型

Java类的加载机制和双亲委派模型1类的加载机制类从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期包括了&#xff1a;加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(using)、和…

任正非:华为 5G 是瞎猫碰死老鼠

喜欢话糙理不糙的任正非&#xff0c;又飙金句。11月6日&#xff0c;在和彭博社记者对话时&#xff0c;谈到华为5G&#xff0c;他说&#xff1a;“回顾这个过程&#xff0c;我们也没有什么必胜的信心&#xff0c;有时候也是瞎猫碰上了死老鼠&#xff0c;刚好碰上世界是这个需求。…

html5游戏开发box2djs,Box2D.js简易示例

Box2dWeb example//在页面加载完毕后启动整个Box2D程序function init() {//简化缩写各个对象名称var b2Vec2 Box2D.Common.Math.b2Vec2;var b2AABB Box2D.Collision.b2AABB;var b2BodyDef Box2D.Dynamics.b2BodyDef;var b2Body Box2D.Dynamics.b2Body;var b2FixtureDef Bo…

七个不容易被发现的生成对抗网络(GAN)用例

像许多追随AI发展的人一样&#xff0c;我无法忽略生成建模的最新进展&#xff0c;尤其是图像生成中生成对抗网络&#xff08;GAN&#xff09;的巨大成功。看看下面这些样本&#xff1a;它们与真实照片几乎没有区别&#xff01; 从2014年到2018年&#xff0c;面部生成的进展也非…

floquet端口x极化入射波_请问CST 2012 floquet中的模式设置

大家好&#xff0c;我用的是CST2012&#xff0c;我已经知道floquet中的TE00和TM00分别代表两种互相正交的线偏振的平面波&#xff0c;那如果我想模拟一束非偏振的平面波入射应该怎么设置?另外&#xff0c;如果我是用TE00的偏振光入射&#xff0c;那么在计算透射率的时候在透射…