用于在 bash 中更新 xml 的 xpath 表达式

xpath expression for updating xml in bash

我写了一个使用第三方软件的部署脚本。

它会安装 XML 格式的 .plist 文件。

但是为了运行软件,我需要更新文件中的一个XML节点。

来自

<plist>
  <dic>
    <key>dynamic_ipaddress</key>
    <array>
    </array>
  </dict>
</plist>

<key>dynamic_ipaddress</key>
<array>
      <string>127.0.5.1</string>
</array>

我试过了

xmlstarlet ed -L -u "//plist/dict/[key='dynamic_ipaddress']/array/string" -v 'xxxxxx' file.xml

它不起作用。因表达式无效而失败。

正确的 xpath 表达式是什么?

您实际上想将 xpath 更新为 "array",添加一个子节点。我已经扩充了您的示例文件以进行演示:

$ cat file.xml
<plist>
  <dict>
    <key>dynamic_ipaddress</key>
    <array>
    </array>
  </dict>
  <dict>
    <key>something else</key>
    <array><number>42</number></array>
  </dict>
</plist>

$ xmlstarlet ed -s '/plist/dict[key="dynamic_ipaddress"]/array' -t elem -n string -v foo file.xml
<?xml version="1.0"?>
<plist>
  <dict>
    <key>dynamic_ipaddress</key>
    <array>
    <string>foo</string></array>
  </dict>
  <dict>
    <key>something else</key>
    <array>
      <number>42</number>
    </array>
  </dict>
</plist>