解析xml并将数据提取到表中的最有效方法

时间:2017-03-14 16:57:32

标签: xml bash hp-ux

关于我想要达到的目标的一些背景。

目前在我使用bash和perl的锁定HPUX盒子上,我没有使用perl的经验。

输入是以下格式(0到n)的十六进制和xml转储:

MQGET of message number 1

Message Descriptor
Various Config / Params
Various Config / Params
Various Config / Params

Message

length - 3631 bytes

00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<config  params>'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<config  params>'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<config  params>'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<config  params>'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<config  params>'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<config  params>'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<config  params>'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<config  params>'

00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<config  params>'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<soapenv:Envelop'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        'e xmlns:soapenv='
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '"http://schemas.'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<useful_xml_data'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<useful_xml_data'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<useful_xml_data'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<useful_xml_data'

00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<useful_xml_data'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<useful_xml_data'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<useful_xml_data'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<useful_xml_data'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        '<xml_data_closin'
00000000:   3453 5675 2346 2345 2346 8679 3452 7554        'g_tag>          '

我希望得到以下输出:

1 <useful_xml_data> <specific_value> <specific_xml>
2 <useful_xml_data> <specific_value> <specific_xml>
n <useful_xml_data> <specific_value> <specific_xml>

目前我的方法如下:

untouchable_script_sdout | sed -n "/^[0000]/p" | cut -c59-74 | tr -d '\n'

除去xml之外的所有内容并删除所有换行符。

然后我将它传递给类似于此post的xml解析脚本,当实体等于xml结束标记时,它会添加\ n。

这让我有以下几点:

<msg1_open_tag>
<xml_tag>value
</xmltag>
<xml_tag>value
</xmltag>
....
</close_tag>

<msgn_open_tag>
<xml_tag>value
</xmltag>
<xml_tag>value
</xmltag>
</close_tag>
....

这意味着我可以使用grep / awk提取我想要的数据,但是我很难对齐数据(某些消息可能包含空值)。

在我的脑海中,下一步是将每条消息的xml放在一行:

<msg1_open_tag>  <xml_tag>value  </xmltag>  <xml_tag>value  </xmltag>    </close_tag>
<msgn_open_tag>   <xml_tag>value   </xmltag>   <xml_tag>value   </xmltag>   </close_tag>

根据需要循环进行这些处理和打印以获得表格。

但是,我努力将每条消息都放到一行。

你可以毫无疑问地告诉我,我远不是一个bash专家,我只是在我走的时候把它拿起来。

非常感谢任何建议或最佳实践指示。

2 个答案:

答案 0 :(得分:0)

您可以使用sed将数据与mikeserv对另一个question的回答中解释的技巧对齐:

sed '/open_tag/,/close_tag/{H;$!d};x;s/\n/  /g'

此外,

sed -n "/^[0000]/p"

仅匹配第一个零,因为 [list] 匹配列表中的单个字符,因此保留括号可能会执行您对该步骤的预期操作。

答案 1 :(得分:0)

不幸的是,我无法获得建议的sed命令。

经过几个小时的修补和Google-Fu之后我想出了以下内容:

#par_xml is a modified version from mikeserv's answer which was linked above
#awk 'NR%4 !=0' is to remove a duplicate value (constant on every message)

par_xml.sh app_xml.out | grep –E "UsefulXML1|UsefulXML2|UsefulXML3|UsefulXML4" | grep –v "</" | awk –F'>' '{print $2}' | awk 'NR%4 !=0' | sed 'N;N;N;s/\n/ /g'

是的,我知道这个解决方案有多糟糕......但它让我获得了理想的输出:

useful_xml_data1 specific_value1 specific_xml1 useful_xml_data1
useful_xml_data2 specific_value2 specific_xml2 useful_xml_data2
useful_xml_datan specific_valuen specific_xmln useful_xml_datan