![xmlstarlet을 사용하여 네임스페이스가 포함된 XML 매개변수 업데이트](https://rvso.com/image/192237/xmlstarlet%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%84%A4%EC%9E%84%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20XML%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%20%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8.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