xmllint exibe o valor do segundo atributo se o primeiro corresponder

2

meu xml parece

<list1>
   <list2 id="abc" value="yes"></list2>
   <list2 id="xyz" value="no"></list2>
   <list2 id="def" value="yes"></list2>
<list1>

usando xmllint , mas não consigo obter a saída correta. Quando eu consultar o xml acima dando "abc", preciso retornar "sim".

    
por kumar2008 31.07.2015 / 01:58

2 respostas

1

Você pode usar a função XPath string() para obter apenas o valor do atributo value :

$ xmllint --xpath 'string(//list1/list2[@id="abc"]/@value)' data.xml
yes

Você poderia capturar isso para uma variável usando a sintaxe típica de bash :

value=$(
  xmllint --xpath \
  'string(//list1/list2[@id="abc"]/@value)' data.xml
)

E então:

echo $value

Resultados em:

yes
    
por 31.07.2015 / 03:39
1
  1. Seu xml está no formato incorreto. Você tem um final prematuro de dados na lista de tags1. Deveria ter </list1> no final.
  2. Como sugerido pelo @ eyoung100, atualize seu xmllint .
  3. echo 'cat //list1/list2[@id="abc"]/@value' | xmllint --shell myxml | awk -F'[="]' '!/>/{print $(NF-1)}' funcionará se você corrigir o xml , conforme mencionado no ponto 1 & Certifique-se de ter o arquivo myxml em seu diretório de trabalho atual (ou use caminhos absolutos), embora não seja o jeito certo de fazer as coisas.

Código:

myvar='abc'
myxml='myxml'
myvalue="cat //list1/list2[@id=\"'$myvar'\"]/@value | xmllint --shell $myxml"
sh -c "echo $myvalue | gawk -F'[=\"]' '!/>/{print \$(NF-1)}'"

É isso que você está tentando fazer?

    
por 31.07.2015 / 05:25

Tags