XML:如何在整个XML中搜索并按id查找节点并删除它们?
xml文件的一个简单示例XML:如何在整个XML中搜索并按id查找节点并删除它们?,xml,bash,xquery,xmlstarlet,basex,Xml,Bash,Xquery,Xmlstarlet,Basex,xml文件的一个简单示例 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <speklap name="gj"> <book> <title lang="en" id="1">Harry Potter</title> <pri
<?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>
哈利·波特
29.99
学习XML
39.95
学习XPATH
1
我想要实现的是搜索一个属性为id=2和id=3的节点,并仅删除这两个节点。问题是,我可以通过针对节点找到足够多的示例,但无法找到如何搜索整个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>
哈利·波特
29.99
39.95
1
制作一个简单的脚本很好,但我是个初学者。我试过XQuery。但是我也对bash脚本感兴趣。希望有人能在BaseX方面帮助我,以下命令调用可用于删除文档中的节点:
xmlstarlet ed -d "//*[@id='1'or @id='2']" test.xml
basex -u -i test.xml "delete node //*[@id = (2, 3)]"
使用-u
,更新将传播回原始文件。使用-i
,指定输入文档。后续字符串是具有请求的更新的有效XQuery表达式
一种替代方法是直接在查询中指定输入文档(我稍微修改了谓词;它与第一个版本等效):
您使用的是哪个XQuery处理器?我使用的是basex 9.5这可能会有所帮助:Thx Cyrus我设法用xml starlet修复了它,但只使用了一个id:您知道如何添加第二个id吗?xmlstarlet ed-d“/*[@id='1']”test.xml
xmlstarlet ed-d“/*[@id='1']”-d“/*[@id='2']”test.xml
?如果需要范围,也可以这样做xmlstarlet ed-d”//*[@id>'0'和@idGreat-response。如果你添加一点解释,我会投赞成票。
basex -u "delete node doc('test.xml')//*[@id = 2 or @id = 3]"