利用sed将xml报文转换为分隔符形式报文

原始xml文本如下

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <Message>
 3   <Header>
 4     <Version>2000000</Version>
 5     <MessageClass>5</MessageClass>
 6     <MessageType>7</MessageType>
 7     <SenderId>9999999964020001</SenderId>
 8     <ReceiverId>9999999964011001</ReceiverId>
 9     <MessageId>3280260</MessageId>
10   </Header>
11   <Body ContentType="1">
12     <ClearTargetDate>2017-03-22</ClearTargetDate>
13   <ServiceProviderId>9999999934030001</ServiceProviderId>
14     <IssuerId>9999999964011001</IssuerId>
15     <MessageId>406843026</MessageId>
16     <Count>1</Count>
17     <Amount>110.00</Amount>
18     <Transaction>
19       <TransId>1</TransId>
20       <Time>2017-03-21T20:40:36</Time>
21       <Fee>110.00</Fee>
22       <Service>
23         <ServiceType>1</ServiceType>
24         <Description>曹庄|宿州</Description>
25         <Detail>1|04|3401|804|33|20170321 204036|03|3401|1105|1|20170321 182056</Detail>
26       </Service>
27       <ICCard>
28         <CardType>22</CardType>
29         <NetNo>6401</NetNo>
30         <CardId>1638220100098530</CardId>
31         <License>宁B63222</License>
32         <TransNo>104</TransNo>
33         <PreBalance>2157.60</PreBalance>
34         <PostBalance>2047.60</PostBalance>
35       </ICCard>
36       <Validation>
37         <TAC>9439DAD2</TAC>
38         <TransType>09</TransType>
39         <TerminalNo>0134000030BC</TerminalNo>
40         <TerminalTransNo>0018002D</TerminalTransNo>
41       </Validation>
42       <OBU>
43         <NetNo>C4FE</NetNo>
44         <OBUId>0000000200031918</OBUId>
45         <OBEState>0001</OBEState>
46         <License>宁B63222</License>
47       </OBU>
48     </Transaction>
49   </Body>
50 </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
时间: 2024-10-29 20:09:28

利用sed将xml报文转换为分隔符形式报文的相关文章

利用XPath读取Xml文件

之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素.可以把XPath比作文件管理路径:通过文件管理路 径,可以按照一定的规则查找到所需要的文件:同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点. 不过,由于XPath可应用于不止一个的标准,因此W3C将其独立出来作为XSLT的配套标准颁布,它是XSLT以及我们后面要讲到的XPointer的重要组成部分. 在介绍XPath的匹配规则之前,我们先来看一些有关XPath的基

57 利用sed处理windows和Unix文档中的行结束符

UNIX和DOS/Windows系统的纯文本格式的换行方式是不同的,基于DOS/Windows的文本文件在每一行末尾有一个CR(回车)和LF(换行),而UNIX文本只有一个换行. 如果想将一个Unix文本转换为Windows文本,可以使用如下的sed命令行 sed -e 's/$/\r/' myunix.txt > mywin.txt 在该脚本中,'$'规则表达式将与行的末尾匹配,而'\r'告诉sed在其之前插入一个回车.在换行之前插入回车,立即,每一行就以CR/LF结束. 虽然很多程序不在乎D

xml+xsl转换为html

项目需要,需要使用xml+xsl转换为html文件存储. 以前也没做过这样的功能,上网搜索到的结果基本上xml和xsl都是以文件的形式保存和输入的,但我这里已经是拿到字符串了,所以考虑是否能直接使用字符串. 通过阅读对应StreamSource的代码发现是完全可行的. 另外大部分网上的示例都可能出现FileNotFoundException异常,还好找到了解决办法. 以下为代码: /** * 使用xml+xsl转换成html文件 * @param xml xml内容字符串 * @param xs

利用xslt将xml转为word

看过相关资料后,总结如下: 需要考虑使用微软提供的open xml sdk架构: 在微软的该结构下,所有的word文件其实都是一个zip文件包,其中存在一个document.xml文件,需要替换该文件: 大概流程是: 准备一个word模板文件,其中存在document.xml文件(可以用winrar软件打开查看): 准备好需要转换的xml文件,如demo.xml: 编写xslt文件,在前两者的基础上将需要转换的demo.xml文件转换为document.xml进行替代: 再使用word软件打开w

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

这两天做<Linux操作系统>课程的作业,碰到了一个题目,感觉很有意思,很考验对awk掌握的熟练度,故特意拿来分享. 首先说题目是这样的,有这样一段文本: RECORD #这是多余的注释行one #record_type students #这是多余的注释行two F sno 11111110000 F name 王铁蛋 F gender 男 F age 20 F class 网络工程01 F region 湖北省武汉市 . RECORD #这是多余的注释行one #record_type s

java语言将任意一个十进制数数字转换为二进制形式,并输出转换后的结果

1 package com.llh.demo; 2 3 import java.util.Scanner; 4 5 /** 6 * 7 * @author llh 8 * 9 */ 10 public class Test { 11 /* 12 * 将任意一个十进制数数字转换为二进制形式,并输出转换后的结果(使用数组存储) 13 */ 14 public static void main(String[] args) { 15 Scanner sc = new Scanner(System.in

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

首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message> <sms> <body> 陈驰0 </body> <date> 1462162910995 </date> <address> 1380 </address> <type> 1 </type> &

XML参数转换为Object,并转换为List或DataTable

demo效果: using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Runtime.Serialization.Json; using System.Text; using

利用TinyXML解析XML文件

下载地址:TinyXML 解压缩TinyXML后,找到六个文件: tinystr.h.tinystr.cpp.tinyxml.h.tinyxml.cpp.tinyxmlerror.cpp.tinyxmlparser.cpp 将这六个文件放在你的C++工程中,跟你的源文件在同一目录下. 新建一个XML文件,命名为Students.xml : <Class name="计算机软件班"> <Students> <student name="张三&quo