【问题标题】:How to extract all tags and content between them from the XML file?如何从 XML 文件中提取它们之间的所有标签和内容?
【发布时间】:2015-08-15 23:15:17
【问题描述】:

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

例如,如果我有 XML 文件,带有分隔符标签:

<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>

【问题讨论】:

  • 那不是有效的 XML。第一个a 标记中的bc 标记永远不会关闭。

标签: xml bash awk sed


【解决方案1】:

使用您的示例并假设标签 a 内没有 &lt;/a&gt;

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
                    }'
  • 创建与&lt;a&gt;...&lt;/a&gt;标签一样多的File.1 2 3
  • 使用第一个 sed 将 &lt;a&gt;...&lt;/a&gt; 子字符串分隔为段落(在与输出操作部分相同的 awk 中对我来说不容易),使用 awk 发送到不同的文件(无法从 sed)
  • 文件标题和尾随部分的删除是可选的s#\(.*&lt;/a&gt;\).*$#\1#s/\(&lt;a&gt;.*\)$/\1/

【讨论】:

  • 我最终使用了这个解决方案,因为在我的情况下 XML 的格式不正确。感谢您的回答。
【解决方案2】:

我会使用 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.xmlchmod +x 之后)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多