Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML:如何在整个XML中搜索并按id查找节点并删除它们?_Xml_Bash_Xquery_Xmlstarlet_Basex - Fatal编程技术网

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

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文件的一个简单示例

<?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]"