利用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 ...
随机推荐
- Linux基础提高_系统性能相关命令
w 看系统的负载信息 用于显示已经登陆系统的用户列表,并显示用户正在执行的指令 uptime [root@localhost]#uptime 17:26:07 up 9:02, 3 users, lo ...
- Day003_Linux基础——系统目录结构
Linux系统的目录结构: 圆型节点代指目录,方型节点代指文件. 图中省去了很多不常用的目录与文件. 稍后单独讲/proc目录与/var目录. /usr 目录. /usr/local 用户个人安装的软 ...
- EditPlus5.0破解激活
永久激活用户名激活码: 用户名:Vovan注册码:3AG46-JJ48E-CEACC-8E6EW-ECUAW 然后重启软件即可
- Android的消息循环与Handler机制理解
一.概念 1.事件驱动型 什么是事件驱动?就是有事了才去处理,没事就躺着不动.假如把用户点击按钮,滑动页面等这些都看作事件,事件产生后程序就执行相应的处理方法,就是属于事件驱动型. 2.消息循环 把需 ...
- android 滚动时间选择器
一.概述 滚动时间选择现在貌似很常用,所以就总结一下,显示效果一般般 , 做个参考吧! 以上就是效果图,可以滚动选择 日期时间, 由于是在 5.0系统运行的,貌似5.0系统做了什么变动,下面的 &qu ...
- 【第十三篇】mvc下载文件,包括配置xml保护服务端文件不被外链直接访问
这里先说下载文件 <a style="color:black; margin-right:3px;" onclick="dowAtt(' + index + ')& ...
- 面试常见问题:java中wait()和sleep()方法的区别
wait()和sleep()方法都是用来控制多线程的有力工具,那么它们之间有什么巨大的区别呢? 1.wait()方法是属于Object类的,而sleep()方法是属于Thread类的. 2.最重要的一 ...
- 策略模式+注解 干掉业务代码中冗余的if else...
前言: 之前写过一个工作中常见升级模式-策略模式 的文章,里面讲了具体是怎样使用策略模式去抽象现实中的业务代码,今天来拿出实际代码来写个demo,这里做个整理来加深自己对策略模式的理解. 一.业务 ...
- Peer reports incompatible or unsupported protocol version.
问题描述 ==> CentOS 操作系统 git clone 项目时出现类似如下错误: fatal: unable to access 'https://github.com/rancher/r ...
- 松软科技课堂:索引器计时器Timer
在.NET中有三种计时器:1.System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet.Timer控件只有绑定了Tick事件和设置Enabled=True后才会 ...