如何用XMLstarlet批量删除XML中各product下的重复Price标签?
解决XML中每个product节点下重复Price标签的删除问题
先看你的XML文档,每个product节点下都有两个重复的Price标签:
<products> <product> <Title>Name of product 1</Title> <SKU>00016</SKU> <Price>1.98</Price> <Stock>95</Stock> <Price>1.98</Price> </product> <product> <Title>Name of product 2</Title> <SKU>00017</SKU> <Price>2.15</Price> <Stock>45</Stock> <Price>2.15</Price> </product> </products>
你之前用的命令只删除了第一个product下的重复标签,问题出在XPath的定位逻辑上:
xmlstarlet sel -t -c'//Price[1]' -n filename.xml > temp.txt && xmlstarlet ed -d '//Price[1]' filename.xml > tmp.xml && mv tmp.xml filename_corrected.xml
这里的//Price[1]是选取整个文档中第一个Price节点,不是每个product下的第一个,所以只会处理第一个product里的标签。
正确的命令
要删除每个product下的重复Price标签(保留第一个,删除后续重复项),用下面的命令:
xmlstarlet ed -d '//product/Price[position() > 1]' filename.xml > filename_corrected.xml
命令解释
//product/Price[position() > 1]:这个XPath会匹配每个product节点下位置大于1的Price标签,也就是每个product里的重复项。-d:xmlstarlet的edit模式中,该参数表示删除匹配到的节点。- 直接将处理后的内容输出到
filename_corrected.xml,不需要额外的临时文件操作。
如果你的每个product下固定只有两个Price标签,也可以用//product/Price[2]精准定位第二个标签,效果完全一致。
内容的提问来源于stack exchange,提问作者weby
相关产品推荐
相关产品推荐

