![xmlstarlet を使用して、名前空間で XML パラメータを更新します。](https://rvso.com/image/192237/xmlstarlet%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93%E3%81%A7%20XML%20%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%BE%E3%81%99%E3%80%82.png)
次の XML ファイルがあります:
<?xml version="1.0" encoding="UTF-8" ?>
<engineConfiguration xmlns="http://bla.com/engine/management/engineConfiguration">
<engineParameter>
<name>PORT_ID</name>
<value>47827</value>
</engineParameter>
<engineParameter>
<name>POS_PRINTER_PORT_ID</name>
<value>27001</value>
</engineParameter>
<engineParameter>
<name>PDS_WS_LOCATION</name>
<value>http://localhost:8080/pds-jbrain-ws/pdsservice?wsdl</value>
</engineParameter>
</engineConfiguration>
値を更新しようとしていますPOS_PRINTER_PORT_ID
が、正しく更新するのが困難です。
以下のコマンドを試しました:
xmlstarlet ed -u '/engineConfiguration/engineParameter/POS_PRINTER_PORT_ID' -v 9999 engineConfiguration.xml
xmlstarlet ed -N s=http://bla.com/engine/management/engineConfiguration -u '/s:engineConfiguration/s:engineParameter[name = "POS_PRINTER_PORT_ID"]/value' -v 999 engineConfiguration.xml
私も試していましたxmllint
が、それがxmlstarlet
正しい方法だと読みました。
答え1
name
最後の試みはほぼ正しいですが、ノードとノードに名前空間を追加するのを忘れていますvalue
。
xmlstarlet ed \
-N s=http://bla.com/engine/management/engineConfiguration \
-u '/s:engineConfiguration/s:engineParameter[s:name = "POS_PRINTER_PORT_ID"]/s:value' \
-v 9999 file.xml
または、式にハードコードされた値ではなく、コマンド ラインからインポートされたパラメーターを使用します。
xmlstarlet ed \
-N s='http://bla.com/engine/management/engineConfiguration' \
--var n "'POS_PRINTER_PORT_ID'" --var v "'9999'" \
-u '/s:engineConfiguration/s:engineParameter[s:name = $n]/s:value' \
-x '$v' file.xml
使用xq
:
xq -x '( .engineConfiguration.engineParameter[] |
select(.name == "POS_PRINTER_PORT_ID").value ) |= 9999' file.xml
パラメータ付き:
xq --arg n 'POS_PRINTER_PORT_ID' --arg v 9999 \
-x '( .engineConfiguration.engineParameter[] |
select(.name == $n).value ) |= $v' file.xml