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