我正在创建一个 bash 脚本来使用 XMLStarlet 替换大型 XML 文件中的各种值。 对于一种特定情况,我无法找到正确的 XMLStarlet 命令行语法。
我创建了一个简化的 XML 文件 (test.xml) 来展示我的情况:
<?xml version="1.0"?>
<DATA VERSION="1.0">
<TABLES>
<ITEM>
<ID>1234</ID>
<prop3>ABCD</prop3>
</ITEM>
<ITEM>
<ID>5678</ID>
<prop3>EFGH</prop3>
</ITEM>
</TABLES>
</DATA>
我正在尝试用特定 ID(例如 5678)替换 ITEM 的 prop3。 我在 stackoverflow 上发现了一个非常相似的问题/回复,这给了我很好的希望,让我找到解决方案。这确实有帮助,但只是部分帮助。
我构建了以下命令,但它并不完全正确,因为它没有效果(XML 不变):
xmlstarlet ed -u "/DATA/TABLES/ITEM[@ID='5678']/prop3" -v "succes" test.xml
XPath 片段
ITEM[@ID='5678']
查找具有匹配 ITEM
属性:
ID
的 <ITEM ID="5678">
元素。您的示例 XML 文档不使用 ITEM
元素上的属性,因此其中的任何内容都不会匹配。要将元素与匹配的 子元素 进行匹配,请删除 @
,它将进行替换:
$ xmlstarlet ed -u "/DATA/TABLES/ITEM[ID='5678']/prop3" -v "succes" test.xml
<?xml version="1.0"?>
<DATA VERSION="1.0">
<TABLES>
<ITEM>
<ID>1234</ID>
<prop3>ABCD</prop3>
</ITEM>
<ITEM>
<ID>5678</ID>
<prop3>succes</prop3>
</ITEM>
</TABLES>
</DATA>