我需要使用 xmlstarlet 来过滤 XML 的内容并根据子元素标准导出元素
使用这种xml:
<products>
<product>
<product_code>1-70-032-0023</product_code>
<availability>criteria_i_need</availability>
<quantity>393</quantity>
</product>
<product>
<product_code>1-70-032-0024</product_code>
<availability>criteria_i_need</availability>
<quantity>19</quantity>
</product>
<product>
<product_code>1-70-032-0046</product_code>
<availability>criteria_i_do_NOT_need</availability>
<quantity>351</quantity>
</product>
</products>
使用命令:
xmlstarlet ed -d '/product/availability[. = "criteria_i_need"]' input-file.xml > filtered-file.xml
但输出文件包含所有元素,而不仅仅是符合条件的 2 个第一个元素。
不完全清楚您期望
filtered-file.xml
包含什么,但是由于您使用ed -d
作为论点,我假设您想删除一个<product>
确实不符合您的标准并保存其余的。
所以我会把你的命令改为
xmlstarlet ed -d '//product[not(.//availability[. = "criteria_i_need"])]' input-file.xml > filtered-file.xml
看看它是否有效。
或者,您可以删除特定条件,例如:
xmlstarlet ed -d 'products/product[availability = "criteria_i_do_NOT_need"]'
或与
contains()
:
xmlstarlet ed -d 'products/product[contains(availability, "_NOT_")]'