XML:如何在整个 xml 中搜索并按 id 查找节点并删除它们?

问题描述

一个简单的xml文件示例

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>
    <speklap name="gj">
    <book>
      <title lang="en" id="1">Harry Potter</title>
      <price>29.99</price>
    </book>
    <book>
        <title lang="en" id="2">Learning XML</title>
        <price>39.95</price>
      </book>
    <photostore>
        <photo>
             <title lang="en" id="3">Learning XPATH</title>
             <price>1.000</price>
           </photo>
       </photostore>
    </speklap>
 </bookstore>

我想要实现的是搜索具有属性 id =2 和 id=3 的节点并删除仅这 2 个节点。问题是我可以通过定位节点找到足够多的示例,但不能找到如何搜索整个 xml 并根据 id 查找节点并仅删除具有此 id 的节点。

所以期望的输出是:

<bookstore>
    <speklap name="gj">
    <book>
      <title lang="en" id="1">Harry Potter</title>
      <price>29.99</price>
    </book>
    <book>
        <price>39.95</price>
      </book>
    <photostore>
        <photo>
             <price>1.000</price>
           </photo>
       </photostore>
    </speklap>
 </bookstore>

制作一个简单的脚本会很棒,但我是初学者。我试过 XQuery。但我也对 bash 脚本感兴趣。希望有人能帮助我朝着好的方向发展

解决方法

xmlstarlet ed -d "//*[@id='1'or @id='2']" test.xml
,

使用 BaseX,可以使用以下命令调用删除文档中的节点:

basex -u -i test.xml "delete node //*[@id = (2,3)]"

使用 -u,更新将传播回原始文件。使用 -i,指定输入文档。后续字符串是具有请求更新的有效 XQuery 表达式。

另一种方法是在查询中直接指定输入文档(我对谓词稍作修改;它相当于第一个版本):

basex -u "delete node doc('test.xml')//*[@id = 2 or @id = 3]"