如何在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
说明
- 显式声明
xquery version "3.0"以启用XQuery更新特性; - 使用
copy $temp := $input创建原XML的副本,避免直接修改源数据; - 在
modify语句中指定要删除的节点:$temp/innerElement[Id ne "1234"],即删除所有Id不等于1234的innerElement节点; - 最后返回修改后的副本
$temp,输出处理后的XML。
内容的提问来源于stack exchange,提问作者Gilles Quénot
相关产品推荐
相关产品推荐

