如何用xmlstarlet删除XML中属性值重复的节点?
基于XML属性值删除重复条目解决方案
原始XML
<?xml version='1.0' encoding='UTF-8'?> <root> <entries> <entry name="entry1"> <value>1</value> </entry> <entry name="entry1"> <!-- Duplicate name here --> <value>2</value> </entry> <entry name="entry2"> <value>3</value> </entry> </entries> </root>
期望结果
<?xml version='1.0' encoding='UTF-8'?> <root> <entries> <entry name="entry1"> <value>1</value> </entry> <entry name="entry2"> <value>3</value> </entry> </entries> </root>
问题分析
你之前使用的命令中,XPath表达式存在两处问题:
- 你的XML没有使用命名空间,
_:前缀属于多余的命名空间占位符,会导致节点匹配失败; .//preceding-sibling::*的递归查找逻辑错误,它会去匹配前置兄弟节点的所有后代节点,而非直接前置的同层级entry节点。
正确命令
使用以下xmlstarlet命令可删除重复的entry节点(保留第一个出现的条目):
xmlstarlet edit --delete '/root/entries/entry[@name = preceding-sibling::entry/@name]' input.xml
如果需要将修改后的结果保存到新文件,可添加输出参数:
xmlstarlet edit --delete '/root/entries/entry[@name = preceding-sibling::entry/@name]' --output output.xml input.xml
命令解释
/root/entries/entry精准定位到所有需要检查的目标节点;[@name = preceding-sibling::entry/@name]筛选出name属性值与之前出现过的同层级entry节点重复的条目,最终通过--delete参数删除这些重复节点。
内容的提问来源于stack exchange,提问作者Symlink
相关产品推荐
相关产品推荐

