多次提取并删除第一次出现的 XML 标记

ram*_*amp 1 xml sed shell-script

我有一个很小的 ​​XML 文件。我已经被提供了,我需要做的就是在 XML 标记之间提取一些值。因为XML我的机器中没有可用的解析器实用程序。我正在寻找一种替代方法。

首先,有一个 XML 标签<capacity> </capacity> 它在 XML 文件中重复了n次,并且在这个 XML 标签之间还有许多其他不同的标签。

我必须分别获取每次出现的<capacity> </capacity>XML 标记,然后解析它并提取它们下的值。

<subcolumns><capacity><name>45.90</name>
<index>0</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
<capacity><name>57.09</name>
<index>1</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
<capacity><name>55</name>
<index>2</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
</subcolumns>
Run Code Online (Sandbox Code Playgroud)

所以我认为的逻辑是找到<capacity> </capacity>XML 标记的第一次出现并将其打印到临时文件,然后删除第一次出现。

<capacity><name>45.90</name>
<index>0</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
Run Code Online (Sandbox Code Playgroud)

此后,当第二次这样做时,<capacity> </capacity>会考虑新的XML 标记对。所以这必须重复多次,直到<capacity> </capacity>找到最后一个标签。每次提取这部分时,数据都会发生变化,并且可以提取。

现在我只想<capacity> </capacity>从主 XML 文件中选择第一次出现的XML 标记并将其打印到临时文件并删除该部分。

这就是我尝试过的,但对我没有任何效果。

sed -n '2,${/<capacity>\(.*\)<\/capacity>/\1/p;q;}' "<input XML file>" >> temp.txt
Run Code Online (Sandbox Code Playgroud)

我的进一步想法是使用该临时文件进行处理并提取我需要在capacity标签下的值。我已经为其编写了逻辑并且运行良好。

Rom*_*est 6

使用 XML 解析器是操作 XML 文档的正确方法。

xmlstarlet解决方案:

xmlstarlet sel -t -c '//capacity[1]' -n yourxml > temp.txt 
&& xmlstarlet ed -d '//capacity[1]' yourxml > tmp.xml && mv tmp.xml yourxml 
Run Code Online (Sandbox Code Playgroud)
cat temp.txt
<capacity><name>45.90</name>
<index>0</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
Run Code Online (Sandbox Code Playgroud)
  • xmlstarlet sel -t -c '//capacity[1]' -n yourxml > temp.txt- 提取第一个capacity标签声明并将输出重定向到temp.txt

  • xmlstarlet ed -d '//capacity[1]' yourxml > tmp.xml-capacity从文档中删除第一个标签(通过-d删除操作)并将修改后的文档内容重定向到临时文件tmp.xml

  • mv tmp.xml yourxml - 用修改后的版本替换初始 xml 文档