XML: 我怎样才能搜索整个 xml 并通过 id 找到节点并删除它们?

XML: how can I search in whole xml and find nodes by id and delete them?

一个 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]"