Aktualisieren Sie den XML-Parameter mit Namespace unter Verwendung von „xmlstarlet“

Aktualisieren Sie den XML-Parameter mit Namespace unter Verwendung von „xmlstarlet“

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_IDWert 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, xmllintaber gelesen, dass das xmlstarletder richtige Weg ist.

Antwort1

nameIhr letzter Versuch ist fast korrekt, aber Sie haben vergessen, den Namespace zu den und valueKnoten 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

verwandte Informationen