如何从XML文件中提取它们之间的所有标签和内容?

时间:2015-06-02 08:48:43

标签: xml bash awk sed

鉴于XML文件,我想提取模式之间的所有字符串并放入单独的文件,最好使用sed,awk,grep等bash工具...

例如,如果我有XML文件,请使用分隔符标记a:

<a><b>yada</b>
<c>yada</c>
</a><a>
foo</a>
<a>bar</a>

我想要包含以下文件:

<a><b>yada</b>
<c>yada</c>
</a>

第二个:

<a>
foo</a>

第三个:

<a>bar</a>

2 个答案:

答案 0 :(得分:3)

我使用的是Python,它的标准库中有一个XML解析器。例如:

#!/usr/bin/python

import xml.dom.minidom as DOM;
import sys;

# first parameter is input file
dom = DOM.parse(sys.argv[1])
i = 0

# find, iterate through all 'a' tags
for tag in dom.getElementsByTagName('a'):
    # Using filenames output1.xml, output2.xml etc.
    # Change format string as required.
    i = i + 1
    with open('output{}.xml'.format(i), 'w') as f:
        print >> f, tag.toxml()

另存为foo.py,请致电

python foo.py input.xml

(或./foo.py input.xml后的chmod +x

答案 1 :(得分:2)

使用您的样本,并假设标签内没有</a>

sed '1!H;1h;$!d
   x
   s#\(.*</a>\).*$#\1#
   s/\(<a>.*\)$/\1/
   s/<a>/\
&/g
   s#</a>#&\
#g' YourFile \
| awk 'BEGIN        {Index=0}
       /<a>/,/<\/a>/{if ( index( $0, "<a>") > 0) Index++
                     print $0 >> "File."Index
                    }'
  • 创建尽可能多的File.1 2 3作为<a>...</a>标记
  • 使用第一个sed将<a>...</a>子字符串分隔为段落(在输出操作部分的同一个awk中对我来说不容易),使用awk发送到不同的文件(不可能来自sed)
  • 删除文件的标题和尾部部分是optionnal s#\(.*</a>\).*$#\1#s/\(<a>.*\)$/\1/