xmlstarlet을 사용하여 네임스페이스로 XML 매개변수 업데이트

xmlstarlet을 사용하여 네임스페이스로 XML 매개변수 업데이트

이 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

마지막 시도는 거의 정확했지만 namevalue노드에 네임스페이스를 추가하는 것을 잊었습니다.

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

관련 정보