我需要选择一组特定的标签,其中包含标签内的特定值。例如,下面是源.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>