#xml #bash #xpath #xmlstarlet
#xml #удар #xpath #xmlstarlet
Вопрос:
Входной XML выглядит как несколько блоков:
lt;Partiesgt; lt;Party compid="CUST1" side="1"gt; lt;Connectionsgt; lt;SocketConnection listenport="9029" /gt; lt;/Connectionsgt; lt;/Partygt; lt;/Partiesgt;
Моя цель состоит в том, чтобы донести до каждого клиента его конкретные параметры, такие как: составьте;прослушайте сообщение
К настоящему времени я могу заставить всех клиентов использовать
xmlstarlet fo -D config.xml | xmlstarlet select -T -t -m '//Parties/Party' -v '@compid' -nl
Следующим шагом будет цикл для каждого клиента, чтобы получить его протокол прослушивания, но
xmlstarlet fo -D config.xml | xmlstarlet select -T -t -m '//Parties/Party[@compid="CUST1"]' -v 'Connections/SocketConnection/@listenport'
или любая другая попытка ничего не возвращает. Я что-то упускаю при использовании фильтрации [@value=string]
?
Заранее спасибо!
Ответ №1:
Своим примером и xmlstarlet
:
xmlstarlet select --text --template --match '//Parties/Party' --value-of 'concat(@compid,";",Connections/SocketConnection/@listenport)' -n config.xml
Выход:
CUST1;9029
Видеть: xmlstarlet select --help