![Aktualisieren Sie den XML-Parameter mit Namespace unter Verwendung von „xmlstarlet“](https://rvso.com/image/192237/Aktualisieren%20Sie%20den%20XML-Parameter%20mit%20Namespace%20unter%20Verwendung%20von%20%E2%80%9Exmlstarlet%E2%80%9C.png)
Ich habe diese XML-Datei:
<?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>
Ich versuche, den POS_PRINTER_PORT_ID
Wert zu aktualisieren, aber es gelingt mir nicht richtig.
Ich habe die folgenden Befehle ausprobiert:
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
Ich habe es auch mit versucht, xmllint
aber gelesen, dass das xmlstarlet
der richtige Weg ist.
Antwort1
name
Ihr letzter Versuch ist fast korrekt, aber Sie haben vergessen, den Namespace zu den und value
Knoten hinzuzufügen :
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
Oder verwenden Sie aus der Befehlszeile importierte Parameter anstelle von fest codierten Werten in den Ausdrücken:
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
Verwenden vonxq
:
xq -x '( .engineConfiguration.engineParameter[] |
select(.name == "POS_PRINTER_PORT_ID").value ) |= 9999' file.xml
Mit Parametern:
xq --arg n 'POS_PRINTER_PORT_ID' --arg v 9999 \
-x '( .engineConfiguration.engineParameter[] |
select(.name == $n).value ) |= $v' file.xml