Como usar o XMLSTARLET para ler o valor do arquivo XML grande?

0

Eu tenho um arquivo XML muito grande e simplesmente preciso ler valores dele. Até agora, não obtive sucesso com o XMLSTARLET. Eu uso o "sel" e, em seguida, tentar fornecer um caminho para o item, mas sem sorte. Não tenho ideia de quais caracteres extras ou campos usar. A corda inteira? Colchetes? Há também uma ferramenta chamada "xml_grep", que eu suponho que eu usaria caminhos com colchetes parecidos com unix para obter os valores.

Alguma idéia?

    
por gmark 15.01.2016 / 21:31

1 resposta

0

Suponho que você queira os valores de determinados elementos nesse arquivo XML e já sabe como especificá-los com o Xpath, por exemplo, //employee[@retired="no"] :

Em seguida, para obter o valor desse único campo

xmlstarlet sel -t -v '//employee[@retired="no"]/name'  thefile.xml

Ou quando você deseja, por exemplo, 2 elementos de cada funcionário, separados por um caractere de pipe:

xmlstarlet sel -t -m '//employee[@retired="no"]' -v name -o "|" -v "age" -nl file.xml

Basicamente, você especifica um modelo (-t), seguido de onde o modelo precisa ser aplicado a (-m seguido pelo Xpath onde corresponder), seguido pelos itens que você deseja extrair desse (-v para valor de).

O programa 'xml_grep', por outro lado, faz parte do XML :: Twig. A idéia do XML :: Twig é que ele não lê todo o xml na memória, mas trabalha no arquivo galho por galho. E isso tem como resultado que você não pode especificar certos Xpaths (por exemplo, galhos referindo-se a elementos irmãos). Quando os XPaths são simples o suficiente para serem especificados apenas em uma base de galho por galho, este programa permite, de fato, que arquivos muito grandes sejam processados, usando apenas uma quantidade limitada de memória.

Você não forneceu informações suficientes sobre a estrutura do arquivo XML ou sobre o tipo de XPaths que você deseja que os valores possam ajudar aqui.

E, é claro, como o XML é apenas um formato de texto, dependendo do formato do arquivo e da complexidade das perguntas, talvez até mesmo outros programas de texto simples possam funcionar:

grep -o '<name>[^<]*</name>' file.xml
    
por 01.02.2016 / 09:48

Tags