使用 unix shell 脚本截断 xml 文件

使用 unix shell 脚本截断 xml 文件

我需要选择一组特定的标签,其中包含标签内的特定值。例如,下面是源.XML 文件

<main tag>
<subTag1>1298</subTag1>
<subTag2>fg</subTag2>
<subTag3>34</subTag3>
</main tag>

<main tag>
<subTag1>1299</subTag1>
<subTag2>cfinfo</subTag2>
<subTag3>43</subTag3>
</main tag>

<main tag>
<subTag1>1300</subTag1>
<subTag2>BBcycle</subTag2>
<subTag3>55</subTag3>
</main tag>

我需要将主标签值中子标签1 值为 1300 的所有内容选到另一个 XML 中。如果子标签1 的值为 1300,则预期输出如下。(Result.XML)

<main tag>
<subTag1>1300</subTag1>
<subTag2>BBcycle</subTag2>
<subTag3>55</subTag3>
</main tag>

同样,我需要使用一组 subTag1 值来选择主标记元素。如果 subTag1 值为 1299 和 1300,则预期输出如下。(Result.XML)

    <main tag>
    <subTag1>1299</subTag1>
    <subTag2>cfinfo</subTag2>
    <subTag3>43</subTag3>
    </main tag>

    <main tag>
    <subTag1>1300</subTag1>
    <subTag2>BBcycle</subTag2>
    <subTag3>55</subTag3>
    </main tag>

PS:标签之间没有换行符,这是为了更好地理解而添加的。在实际情况下,有很多主标签,我有一组 SubTag1 值来获取相应的主标签块,如上例所示(将在单个结果 XML 文件中创建)。如果脚本用户可以提供一组 subTag1 值以便在 SOURCE.XML 中进行搜索,那就合适了。

我考虑过使用 grep,但它无法帮助选择标签集。我需要使用 UNIX shell 脚本来执行此操作。

答案1

您需要一个 XML 解析工具。xmlstarlet是我最喜欢的。修复无效 XML 后,我们

$ xmlstarlet ed -d '//main_tag[subTag1 != 1300]' file.xml
<?xml version="1.0"?>
<root_tag>
  <main_tag>
    <subTag1>1300</subTag1>
    <subTag2>BBcycle</subTag2>
    <subTag3>55</subTag3>
  </main_tag>
</root_tag>

$ xmlstarlet ed -d '//main_tag[subTag1 != 1300 and subTag1 != 1299]' file.xml
<?xml version="1.0"?>
<root_tag>
  <main_tag>
    <subTag1>1299</subTag1>
    <subTag2>cfinfo</subTag2>
    <subTag3>43</subTag3>
  </main_tag>
  <main_tag>
    <subTag1>1300</subTag1>
    <subTag2>BBcycle</subTag2>
    <subTag3>55</subTag3>
  </main_tag>
</root_tag>

我发现这一页一个有用的 xpath 教程。

答案2

我会选择

grep -A 3 -B 1 '<subTag1>1300</subTag1>' infile.xml > outfile.xml

-A选择上下文后的行。 -B选择上下文前的行

输出效果很好

<main tag>
<subTag1>1300</subTag1>
<subTag2>BBcycle</subTag2>
<subTag3>55</subTag3>
</main tag>

相关内容