原始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报文转换为分隔符形式报文的更多相关文章

  1. 一个利用sed和awk处理文本的小栗子

    这两天做<Linux操作系统>课程的作业,碰到了一个题目,感觉很有意思,很考验对awk掌握的熟练度,故特意拿来分享. 首先说题目是这样的,有这样一段文本: RECORD #这是多余的注释行 ...

  2. 【XML】利用Dom4j读取XML文档以及写入XML文档

    Dom4j简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能 ...

  3. Linux shell利用sed如何批量更改文件名详解[转载]

     需求背景: 目录A用来存放自动化的包生成的apk文件,现在开发修改了包名的 命名规则:环境名称(pro|uat)-release-日期-v版本号.apk 原来的是思路是通过正则表达式匹配新的包名,但 ...

  4. 如何将EDI报文转换为CSV格式文件?

    如果您对EDI项目实施有一定的了解,想必您一定知道,在正式开始EDI项目实施之前,都会有EDI顾问与您接洽,沟通EDI项目需求.其中,会包含EDI通信双方使用哪种传输协议,传输的报文是符合什么标准的, ...

  5. js压缩xml字符串,将xml字符串转换为xml对象,将xml对象转换为json对象

    /** * 压缩xml字符串 */ function compressXmlStr(str){ var prefix, suffix; var i = str.indexOf("\r&quo ...

  6. 报文格式:xml 、定长报文、变长报文

    目前接触到的报文格式有三种:xml .定长报文.变长报文 . 此处只做简单介绍,日后应该会深入学习到三者之间如何解析,再继续更新.——2016.9.23 XML XML 被设计用来传输和存储数据. H ...

  7. 一个简单xml数据转换为数组的方法

    本人用easywechat做微信回复图文,从数据库中拿到的数据直接是xml拼好的数据,但是框架只有自带的获取xml格式的语句,所有需要将xml数据中所需要的数据拿出来用来拼接. 搜了好多资料说的都很麻 ...

  8. 利用Code128字体将文本转换为code128条形码

    利用Code128字体将文本转换为code128条形码[转]   最近在做仓储的项目,许多的打印文件都包含条形码,之前一直使用C39P24DhTt字体直接转换为39码,但是最近要求使用code128编 ...

  9. 使用XML序列化器生成XML文件和利用pull解析XML文件

    首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...

随机推荐

  1. SpringBoot系列__01HelloWorld

    接触SpringBoot很久了,但是一直没有很深入的研究一下源码,最近重启了博客,顺便开始深入研究一下技术. 1.简介 参照官方文档的说法,SpringBoot的设计理念就是为了简化Java程序员搭建 ...

  2. 编写一个函数来反转某个二进制型里的字节顺序(erlang)

    reverse_byte(<<>>) -> <<>>; reverse_byte(<<Header:8, Tail/bits>& ...

  3. virtualbox下最小化安装centos7后上网设置

    在虚拟机中以最小化方式安装centos7,后无法上网,因为centos7默认网卡未激活. 可以设置 文件 /etc/sysconfig/network-scripts/ifcfg-enp0s3 将 O ...

  4. 使用Nginx实现反向代理过程(一台服务器部署两个网站)

    正向代理指的是客户端的 反向代理指的是服务端的 需要实现的反向代理: 1.首先使用SwitchHosts配置不同域名,如下:(SwitchHosts软件在上一篇博客有链接) 2.在Linux上部署两台 ...

  5. JS枚举对象属性的方法及其区别

    愉快的中秋节要过去了,国庆倒计时两个周!!! 闲话不多说,那今天我们来看一看JS中枚举对象属性的方法有哪些以及他们的区别 首先在JS里面枚举对象属性一共有三种方法 for in: 会遍历对象中所有的可 ...

  6. java生成二维码/java解析二维码

    二维码的优缺点 优点:1. 高密度编码,信息容量大:2.编码范围广:3.容错能力强:4.译码可靠性高:5.可引入加密措施:6.成本低,易制作,持久耐用. 缺点:1.二维码技术成为手机病毒.钓鱼网站传播 ...

  7. unittest 常用断言

    1 assertEqual(a,b)  判断a==b 2 assertNotEqual(a,b) 判断a !=b 3 assertTrue(x)  bool (x) is True 4 assertF ...

  8. mysql命令行乱码解决办法

     解决办法: 修改mysql的配置文件my.ini,打开my.ini找到default-charactor-set,改为utf8. 进入命令行: show variables like'%char%' ...

  9. 白话系列之IOC,三个类实现简单的Ioc

    前言:博客园上已经有很多IOC的博客.而且很多写的很好,达到开源的水平,但是对于很多新人来说,只了解ioc的概念,以及怎么去使用ioc.然后想更进一步去看源码,但是大部分源码都比较困难,当不知道一个框 ...

  10. linux iconv 转换文件编码

    查看文件编码file -i filename 递归转换(包括子文件夹)find default -type d -exec mkdir -p utf/{} \;find default -type f ...