如何用xmlstarlet删除包含<blogger:type>COMMENT</blogger:type>的<entry>节点
清理Blogger导出XML:删除含评论的
<entry>节点 需求:清理Blogger博客导出的XML文件,删除所有包含<blogger:type>COMMENT</blogger:type>子节点的<entry>节点(对应评论内容),保留含<blogger:type>POST</blogger:type>的<entry>节点(对应文章内容)。
当前问题:执行命令xmlstarlet edit -d "//blogger:type[text()='COMMENT']" input.xml > output.xml仅删除<blogger:type>COMMENT</blogger:type>节点,无法删除整个<entry>节点。
解决方案
需要调整XPath表达式,直接定位到包含目标<blogger:type>的<entry>节点,而非仅定位<blogger:type>节点本身。以下两种命令均可实现需求:
方法1:通过父节点定位
xmlstarlet edit -d "//blogger:type[text()='COMMENT']/.." input.xml > output.xml
/..表示选取当前节点的父节点,这里就是包含<blogger:type>COMMENT</blogger:type>的<entry>节点,执行后会直接删除整个<entry>。
方法2:直接筛选目标<entry>节点
xmlstarlet edit -d "//entry[blogger:type='COMMENT']" input.xml > output.xml
这种方式更直观,XPath直接筛选出所有包含<blogger:type>子节点且值为COMMENT的<entry>节点,一次性完成删除。
示例验证
输入XML示例:
<?xml version='1.0' encoding='utf-8'?> <feed xmlns='http://www.w3.org/2005/Atom' xmlns:blogger='http://schemas.google.com/blogger/2018'> <id>tag:blogger.com,1999:blog-18962386</id> <title>ImportTestv1</title> <!-- 保留该节点 --> <entry> <id>tag:blogger.com,1999:blog-18962386.post-468340</id> <blogger:type>POST</blogger:type> <blogger:status>LIVE</blogger:status> <author> <name>Author</name> <uri></uri> <blogger:type>BLOGGER</blogger:type> </author> <title></title> <content type='html'>Test Post 3</content> <blogger:metaDescription/> <blogger:created>2025-09-05T14:02:59.354Z</blogger:created> <published>2025-09-04T23:09:00Z</published> <updated>2025-09-05T14:02:59.354Z</updated> <blogger:location/> <category scheme='tag:blogger.com,1999:blog-17477683' term='News'/> <blogger:filename>/2025/09/post.html</blogger:filename> <link/> <enclosure/> <blogger:trashed/> </entry> <!-- 删除整个该节点 --> <entry> <id>tag:blogger.com,1999:blog-18962386.post-3978997</id> <blogger:parent>tag:blogger.com,1999:blog-18962386.post-468340</blogger:parent> <blogger:inReplyTo/> <blogger:type>COMMENT</blogger:type> <blogger:status>LIVE</blogger:status> <author> <name>Author</name> <blogger:type>BLOGGER</blogger:type> </author> <content type='html'>Test Comment2 Test Comment2 Test Comment2</content> <blogger:created>2025-09-14T14:42:53.755Z</blogger:created> <published>2025-09-14T14:42:53.755Z</published> <updated>2025-09-14T14:42:53.755Z</updated> <blogger:trashed/> </entry> </feed>
执行上述任意命令后,输出XML将仅保留含<blogger:type>POST</blogger:type>的<entry>节点,评论对应的<entry>会被完全删除。
内容的提问来源于stack exchange,提问作者user5853892
相关产品推荐
相关产品推荐

