利用sed将xml报文转换为分隔符形式报文
原始xml文本如下
<?xml version="1.0" encoding="utf-8"?>
<Message>
<Header>
<Version>2000000</Version>
<MessageClass>5</MessageClass>
<MessageType>7</MessageType>
<SenderId>9999999964020001</SenderId>
<ReceiverId>9999999964011001</ReceiverId>
<MessageId>3280260</MessageId>
</Header>
<Body ContentType="1">
<ClearTargetDate>2017-03-22</ClearTargetDate>
<ServiceProviderId>9999999934030001</ServiceProviderId>
<IssuerId>9999999964011001</IssuerId>
<MessageId>406843026</MessageId>
<Count>1</Count>
<Amount>110.00</Amount>
<Transaction>
<TransId>1</TransId>
<Time>2017-03-21T20:40:36</Time>
<Fee>110.00</Fee>
<Service>
<ServiceType>1</ServiceType>
<Description>曹庄|宿州</Description>
<Detail>1|04|3401|804|33|20170321 204036|03|3401|1105|1|20170321 182056</Detail>
</Service>
<ICCard>
<CardType>22</CardType>
<NetNo>6401</NetNo>
<CardId>1638220100098530</CardId>
<License>宁B63222</License>
<TransNo>104</TransNo>
<PreBalance>2157.60</PreBalance>
<PostBalance>2047.60</PostBalance>
</ICCard>
<Validation>
<TAC>9439DAD2</TAC>
<TransType>09</TransType>
<TerminalNo>0134000030BC</TerminalNo>
<TerminalTransNo>0018002D</TerminalTransNo>
</Validation>
<OBU>
<NetNo>C4FE</NetNo>
<OBUId>0000000200031918</OBUId>
<OBEState>0001</OBEState>
<License>宁B63222</License>
</OBU>
</Transaction>
</Body>
</Message>
现在需要将上述内容Transaction标签中的值转换为下面的分隔符格式
1|||2017-03-21T20:40:36|||110.00|||1|||曹庄|宿州|||1|04|3401|804|33|20170321204036|03|3401|1105|1|20170321182056||||||22|||6401|||1638220100098530|||宁B63222|||104|||2157.60|||2047.60||||||9439DAD2|||09|||0134000030BC|||0018002D||||||C4FE|||0000000200031918|||0001|||宁B63222|||
下面是我执行的操作步骤
1、替换换行符,将整个xml文件处理成一行文本,重定向到文本1中
cat ***.xml | tr "\n" " " > 1
结果如下
<?xml version="1.0" encoding="utf-8"?><Message> <Header> <Version>2000000</Version> <MessageClass>5</MessageClass> <MessageType>7</MessageType> <SenderId>9999999964020001</SenderId> <ReceiverId>9999999964011001</ReceiverId> <MessageId>3280260</MessageId> </Header> <Body ContentType="1"> <ClearTargetDate>2017-03-22</ClearTargetDate> <ServiceProviderId>9999999934030001</ServiceProviderId> <IssuerId>9999999964011001</IssuerId> <MessageId>406843026</MessageId> <Count>1</Count> <Amount>110.00</Amount> <Transaction> <TransId>1</TransId> <Time>2017-03-21T20:40:36</Time> <Fee>110.00</Fee> <Service> <ServiceType>1</ServiceType> <Description>曹庄|宿州</Description> <Detail>1|04|3401|804|33|20170321 204036|03|3401|1105|1|20170321182056</Detail> </Service> <ICCard> <CardType>22</CardType> <NetNo>6401</NetNo> <CardId>1638220100098530</CardId> <License>宁B63222</License> <TransNo>104</TransNo> <PreBalance>2157.60</PreBalance><PostBalance>2047.60</PostBalance> </ICCard> <Validation> <TAC>9439DAD2</TAC> <TransType>09</TransType> <TerminalNo>0134000030BC</TerminalNo> <TerminalTransNo>0018002D</TerminalTransNo> </Validation> <OBU> <NetNo>C4FE</NetNo> <OBUId>0000000200031918</OBUId> <OBEState>0001</OBEState> <License>宁B63222</License> </OBU> </Transaction> </Body> </Message>
2、去除空格
sed 's/ //g' 1 > 2
结果如下
<?xml version="1.0" encoding="utf-8"?><Message><Header><Version>2000000</Version><MessageClass>5</MessageClass><MessageType>7</MessageType><SenderId>9999999964020001</SenderId><ReceiverId>9999999964011001</ReceiverId><MessageId>3280260</MessageId></Header><BodyContentType="1"><ClearTargetDate>2017-03-22</ClearTargetDate><ServiceProviderId>9999999934030001</ServiceProviderId><IssuerId>9999999964011001</IssuerId><MessageId>406843026</MessageId><Count>1</Count><Amount>110.00</Amount><Transaction><TransId>1</TransId><Time>2017-03-21T20:40:36</Time><Fee>110.00</Fee><Service><ServiceType>1</ServiceType><Description>曹庄|宿州</Description><Detail>1|04|3401|804|33|20170321204036|03|3401|1105|1|20170321182056</Detail></Service><ICCard><CardType>22</CardType><NetNo>6401</NetNo><CardId>1638220100098530</CardId><License>宁B63222</License><TransNo>104</TransNo><PreBalance>2157.60</PreBalance><PostBalance>2047.60</PostBalance></ICCard><Validation><TAC>9439DAD2</TAC><TransType>09</TransType><TerminalNo>0134000030BC</TerminalNo><TerminalTransNo>0018002D</TerminalTransNo></Validation><OBU><NetNo>C4FE</NetNo><OBUId>0000000200031918</OBUId><OBEState>0001</OBEState><License>宁B63222</License></OBU></Transaction></Body></Message>
3、去除无用的头部和尾部xml,只保留Transaction标签中的内容
sed 's/.*<Transaction>//g;s/<\/OBU>.*<\/Message>//g' 2 > 3
结果如下
<TransId>1</TransId><Time>2017-03-21T20:40:36</Time><Fee>110.00</Fee><Service><ServiceType>1</ServiceType><Description>曹庄|宿州</Description><Detail>1|04|3401|804|33|20170321204036|03|3401|1105|1|20170321182056</Detail></Service><ICCard><CardType>22</CardType><NetNo>6401</NetNo><CardId>1638220100098530</CardId><License>宁B63222</License><TransNo>104</TransNo><PreBalance>2157.60</PreBalance><PostBalance>2047.60</PostBalance></ICCard><Validation><TAC>9439DAD2</TAC><TransType>09</TransType><TerminalNo>0134000030BC</TerminalNo><TerminalTransNo>0018002D</TerminalTransNo></Validation><OBU><NetNo>C4FE</NetNo><OBUId>0000000200031918</OBUId><OBEState>0001</OBEState><License>宁B63222</License>
4、将闭合标签</***>替换为|||
sed 's/<\/[^>]*>/|||/g' 3 > 4
结果如下
<TransId>1|||<Time>2017-03-21T20:40:36|||<Fee>110.00|||<Service><ServiceType>1|||<Description>曹庄|宿州|||<Detail>1|04|3401|804|33|20170321204036|03|3401|1105|1|20170321182056||||||<ICCard><CardType>22|||<NetNo>6401|||<CardId>1638220100098530|||<License>宁B63222|||<TransNo>104|||<PreBalance>2157.60|||<PostBalance>2047.60||||||<Validation><TAC>9439DAD2|||<TransType>09|||<TerminalNo>0134000030BC|||<TerminalTransNo>0018002D||||||<OBU><NetNo>C4FE|||<OBUId>0000000200031918|||<OBEState>0001|||<License>宁B63222|||
5、将开始标签<***>去除
sed 's/<[^>]*>//g' 4 > 5
结果如下
1|||2017-03-21T20:40:36|||110.00|||1|||曹庄|宿州|||1|04|3401|804|33|20170321204036|03|3401|1105|1|20170321182056||||||22|||6401|||1638220100098530|||宁B63222|||104|||2157.60|||2047.60||||||9439DAD2|||09|||0134000030BC|||0018002D||||||C4FE|||0000000200031918|||0001|||宁B63222|||
到此大功告成
将所有标签整理在一起
cat ***.xml | tr "\n" " " > 1
sed 's/ //g;s/.*<Transaction>//g;s/<\/OBU>.*<\/Message>//g;s/<\/[^>]*>/|||/g;s/<[^>]*>//g' 1 > 2
利用sed将xml报文转换为分隔符形式报文的更多相关文章
- 一个利用sed和awk处理文本的小栗子
这两天做<Linux操作系统>课程的作业,碰到了一个题目,感觉很有意思,很考验对awk掌握的熟练度,故特意拿来分享. 首先说题目是这样的,有这样一段文本: RECORD #这是多余的注释行 ...
- 【XML】利用Dom4j读取XML文档以及写入XML文档
Dom4j简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能 ...
- Linux shell利用sed如何批量更改文件名详解[转载]
需求背景: 目录A用来存放自动化的包生成的apk文件,现在开发修改了包名的 命名规则:环境名称(pro|uat)-release-日期-v版本号.apk 原来的是思路是通过正则表达式匹配新的包名,但 ...
- 如何将EDI报文转换为CSV格式文件?
如果您对EDI项目实施有一定的了解,想必您一定知道,在正式开始EDI项目实施之前,都会有EDI顾问与您接洽,沟通EDI项目需求.其中,会包含EDI通信双方使用哪种传输协议,传输的报文是符合什么标准的, ...
- js压缩xml字符串,将xml字符串转换为xml对象,将xml对象转换为json对象
/** * 压缩xml字符串 */ function compressXmlStr(str){ var prefix, suffix; var i = str.indexOf("\r&quo ...
- 报文格式:xml 、定长报文、变长报文
目前接触到的报文格式有三种:xml .定长报文.变长报文 . 此处只做简单介绍,日后应该会深入学习到三者之间如何解析,再继续更新.——2016.9.23 XML XML 被设计用来传输和存储数据. H ...
- 一个简单xml数据转换为数组的方法
本人用easywechat做微信回复图文,从数据库中拿到的数据直接是xml拼好的数据,但是框架只有自带的获取xml格式的语句,所有需要将xml数据中所需要的数据拿出来用来拼接. 搜了好多资料说的都很麻 ...
- 利用Code128字体将文本转换为code128条形码
利用Code128字体将文本转换为code128条形码[转] 最近在做仓储的项目,许多的打印文件都包含条形码,之前一直使用C39P24DhTt字体直接转换为39码,但是最近要求使用code128编 ...
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
随机推荐
- 【LeetCode】[0001] 【两数之和】
题目描述 思路分析 Java代码 代码链接 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标.你可以假设每种输入只会对 ...
- .NET Core 3.0 Preview 9 发布
翻译自官方博客 今天,我们宣布推出.NET Core 3.0 Preview 9.就像预览版8一样,我们专注打磨最终版本的.NET Core 3.0,而不是添加新功能.如果这些最终版本看起来不像早期预 ...
- 算法与数据结构基础 - 递归(Recursion)
递归基础 递归(Recursion)是常见常用的算法,是DFS.分治法.回溯.二叉树遍历等方法的基础,典型的应用递归的问题有求阶乘.汉诺塔.斐波那契数列等,可视化过程. 应用递归算法一般分三步,一是定 ...
- Linux 笔记 - 第十六章 LNMP 之(一) 环境搭建
博客地址:http://www.moonxy.com 一.前言 LNMP 中的 N 指 Nginx,在静态页面的处理上,Nginx 较 Apache 更胜一筹:但在动态页面的处理上,Nginx 并不比 ...
- Vuex,从入门到...
Vuex 是什么? 官方是这么说的:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 不懂? ...
- Tomcat启动时设置Jdk版本
1. Window版本Tomcat 到bin下的setclasspath.bat文件,在文件的开始处添加如下代码: set JAVA_HOME=D:\Program Files\Java\jdk1.8 ...
- AMBA——slave的HREADY信号
在前几天的ARM面试中,被问到总线架构,主要是AMBA那一套东西.对于AMBA之前上课学过一点,但很肤浅.为了面试上网查了一下.也看了部分协议补充了一下,但是接触的少,理解的不深入,被问到之前没遇到的 ...
- Python基础(十一)
今日主要内容 补充:三目运算 f-strings 迭代器 生成器 补充:三目运算 三目运算(三元运算)结构: 表达式1 if 条件表达式 else 表达式2 c = a if a > b els ...
- Mysql学习笔记整理之数据库优化
数据库性能瓶颈的原因 数据库连接数 数据量大 硬件资源限制 数据性能优化方案 sql优化 2.缓存 3.建好索引 4.读写分离 5. 分库分表 慢日志查 ...
- SVN更改地址
因为服务器更改或其他某些原因导致svn地址改变,那么本地应该如何操作tortoiseSVN?如何成功的把项目进行迁移? 操作步骤 1.右击项目目录---TortoiseSVN----重新定位(英文版是 ...