xmlstarlet 修改正文中的 XML 属性,该正文还具有具有特定值的属性

问题描述 投票:0回答:1

我正在创建一个 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
xml bash xmlstarlet
1个回答
0
投票

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>
© www.soinside.com 2019 - 2024. All rights reserved.