Como converter um bloco de formato xml genérico para o formato de propriedades String de um arquivo xml usando o script ksh [closed]

1

Com as condições:

  1. Não consigo usar nenhuma ferramenta parser XML, pois não tenho permissão, somente leitura

  2. Minha versão do xmllint não suporta o xpath e não consigo atualizá-lo, somente leitura

  3. Eu não tenho xmlstarlet e não consigo instalá-lo

Minhas opções estão limitadas ao processamento quase String.

Um parâmetro de entrada será fornecido pelo usuário e será o nome do bloco.

Então,

vamos supor

NAME=${USER_INPUT}

e usaremos $NAME como parâmetro para pesquisar o bloco xml que será pesquisado.

Como posso converter um bloco xml genérico como este em um arquivo xml como este:

<block>
 <name>Bob</name>
 <address>USA</address>
 <email>[email protected]</email>
 <phone>1234567</phone>
</block>

<block>
 <name>Peter</name>
 <food>France</address>
 <cell>[email protected]</cell>
 <drinks>Coke</drinks>
 <car>Honda</car>
 <bike>Mountain bike</bike>
</block>

Então, o que eu quero alcançar aqui é obter o bloco xml que satisfaz minha pesquisa,

por exemplo, NAME=Bob ;

A saída do script deve estar no formato de arquivo de propriedades

name=Bob
address=USA
[email protected]
phone=1234567

Uma coisa a considerar aqui é que o formato xml por bloco é diferente. Os nós não são os mesmos para todos os blocos xml.

    
por Philip Morris 24.06.2015 / 18:47

1 resposta

2

O Perl tem um "modo de parágrafo" bacana ( -00 ) onde os registros ("linhas") são separados por uma linha em branco em vez de um único caractere \n . Usando isso, você pode facilmente extrair os registros relevantes. Portanto, primeiro certifique-se de que há uma linha em branco antes de cada <block> e, em seguida, use o modo de parágrafo para encontrar o que você está procurando:

$ sed 's/<block>/\n<block>/' file | perl -00ne 'if(/<name>\s*bob\s*<\/name>/i){print}'
<block>
 <name>Bob</name>
 <address>USA</address>
 <email>[email protected]</email>
 <phone>1234567</phone>
</block>

Agora, coloque isso em um script de shell (usando o bash aqui):

#!/bin/ksh

## Read the search strings
tag="$1"
value="$2"
target="file.xml" ## change this to whatever your xml file is called

## Search
sed 's/<.\?block>/\n/' "$target" |
    perl -00ne "if(/<$tag>\s*$value\s*<\/$tag>/i){
                   ## May as well do the formatting in Perl as well
                   s# *<([^/]+?)>#=#g;
                   s/<\/.+?>//g;
                   print
                 }"

Em seguida, execute o script fornecendo o nome da tag e o valor desejado como entrada:

$ a.sh "name" "bob"
name=Bob
address=USA
[email protected]
phone=1234567
    
por 24.06.2015 / 20:23