xmllint exibe valores de mais de 1 atributos em execução única

5

Estou usando o xmllint para analisar o arquivo xml que tem várias tags e cada tag tem vários atributos. Estrutura da amostra como mostrado abaixo:

<root>
   <child attr1="abc" attr2="def" attr3="ghi" />
   ...
   ...
</root>

Eu preciso buscar os valores dos atributos attr1 , attr2 e attr3 .

Até agora, eu tentei o seguinte, que está dando os dados de um atributo perfeitamente

echo 'cat //root/child/@attr1' | xmllint --shell data.xml 

Esta saída

attr1="abc"

Então, minha pergunta é: como podemos especificar mais de um atributo na string para obter a saída necessária como

attr1="abc"
attr2="def"
attr3="ghi"

Eu tentei o seguinte para isso, mas nenhum resultado bom:

echo 'cat //root/child/@*[attr1|attr2|attr3]' | xmllint --shell data.xml 
echo 'cat //root/child/@*[attr1 or attr2 or attr3]' | xmllint --shell data.xml 

a saída acima foi que a instrução echo foi repetida novamente, o que significa que o xmllint não a aceitou como entrada.

Alguma idéia de como fazer isso?

    
por mtk 23.10.2012 / 22:10

2 respostas

6

Até onde eu sei, o separador | pode ser usado somente em caminhos inteiros:

echo 'cat /root/child/@attr1|/root/child/@attr2|/root/child/@attr3' | xmllint --shell data.xml

(como // significa em qualquer profundidade, // root) coloca o analisador em um trabalho extra sem sentido Supondo que sua aparência XML de exemplo tenha estrutura semelhante à real (assim, root é realmente o nó raiz do XML), melhor use “/ root / child”.)

Ou você pode usar uma expressão com funções XPath:

echo 'cat /root/child/@*[name()="attr1" or name()="attr2" or name()="attr3"]' | xmllint --shell data.xml

Se você precisar de todos os atributos com o nome “attr *”, você pode usar uma expressão genérica:

echo 'cat /root/child/@*[starts-with(name(),"attr")]' | xmllint --shell data.xml
    
por 24.10.2012 / 10:29
-3

grep -o attr[0-9]...... file.ext

rápido e sujo ...

    
por 24.10.2012 / 09:48