问题描述
<?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]"