You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell中使用XQuery结合xidel删除XML节点?

使用XQuery结合xidel删除XML节点的正确方法

需求

在Shell环境中通过XQuery的删除操作结合xidel工具,删除XML中指定的节点。

示例XML

<outerTag>
  <innerElement>
    <Id>1234</Id>
    <fName>Kim</fName>
    <lName>Scott</lName>
<customData1>Value1</customData1>
<customData2>Value2</customData2>
    <position>North</position>
    <title/>
  </innerElement>
  <innerElement>
    <Id>5678</Id>
    <fName>Brian</fName>
    <lName>Davis</lName>
<customData3>value3</customData3>
<customData4>value4</customData4>
<customData5>value5</customData5>
    <position>South</position>
    <title/>
  </innerElement>
</outerTag>

(注:原示例XML中<position>标签存在闭合错误,已修正)

预期输出

<outerTag>
  <innerElement>
    <Id>1234</Id>
    <fName>Kim</fName>
    <lName>Scott</lName>
    <customData1>Value1</customData1>
    <customData2>Value2</customData2>
    <position>North</position>
    <title/>
  </innerElement>
</outerTag>

(注:原预期输出中<position>标签闭合错误,已修正)

错误尝试及问题

尝试1

xidel --xml -e '
    let $element := //innerElement[not(Id["1234"])]
    declare function local:process-xml ($element) {
        $element update delete node
    }
' file.xml

报错:

An unhandled exception occurred at $00000000006174CA:
ERangeError: Range check error
  $00000000006174CA
  $000000000061782C
  $0000000000629536
  $000000000062E638
  $000000000055C12B

尝试2

xidel --xquery '
    let $element := //innerElement[./not(Id["1234"])]
    declare function local:process-xml ($element) {
        $element update delete node                                                   
    }
' file.xml

同样出现上述ERangeError报错。

尝试3

xidel --xml --xquery '
    let $input := /outerTag
    modify delete node $input/innerElement[Id ne "1234"]
    return $input
' file.xml

报错:

Error:
err:XPST0003: Missing whitespace or symbol
in line 2 column 5
    modify delete node $input/innerElement[Id ne "1234"]
    ^^^^  error occurs around here

正确实现方法

xidel支持XQuery 3.0的更新语法,但必须遵循copy-modify-return的结构,不能直接使用modify语句。正确的命令如下:

xidel --xml --xquery '
xquery version "3.0";
let $input := /outerTag
return
  copy $temp := $input
  modify delete node $temp/innerElement[Id ne "1234"]
  return $temp
' file.xml

说明

  1. 显式声明xquery version "3.0"以启用XQuery更新特性;
  2. 使用copy $temp := $input创建原XML的副本,避免直接修改源数据;
  3. 在modify语句中指定要删除的节点:$temp/innerElement[Id ne "1234"],即删除所有Id不等于1234的innerElement节点;
  4. 最后返回修改后的副本$temp,输出处理后的XML。

内容的提问来源于stack exchange,提问作者Gilles Quénot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:42:32