Truncar arquivo xml usando script de shell unix

0

Eu preciso selecionar um conjunto específico de tags que contenha um valor específico dentro da tag. Por exemplo, abaixo está o arquivo source.XML

<main tag>
<subTag1>1298</subTag1>
<subTag2>fg</subTag2>
<subTag3>34</subTag3>
</main tag>

<main tag>
<subTag1>1299</subTag1>
<subTag2>cfinfo</subTag2>
<subTag3>43</subTag3>
</main tag>

<main tag>
<subTag1>1300</subTag1>
<subTag2>BBcycle</subTag2>
<subTag3>55</subTag3>
</main tag>

Eu preciso selecionar todo o conteúdo dos valores da tag principal que tem o valor subTag1 1300 em outro XML. A saída esperada se o valor de subTag1 for dado como 1300 está abaixo. (Result.XML)

<main tag>
<subTag1>1300</subTag1>
<subTag2>BBcycle</subTag2>
<subTag3>55</subTag3>
</main tag>

Da mesma forma, preciso selecionar os elementos da tag principal com um conjunto de valores de subTag1. A saída esperada, se o valor da subTag1 for fornecido como 1299 & 1300 está abaixo. (Result.XML)

    <main tag>
    <subTag1>1299</subTag1>
    <subTag2>cfinfo</subTag2>
    <subTag3>43</subTag3>
    </main tag>

    <main tag>
    <subTag1>1300</subTag1>
    <subTag2>BBcycle</subTag2>
    <subTag3>55</subTag3>
    </main tag>

PS: não há quebra de linha entre as tags, adicionadas para melhor entendimento. No cenário real, há muitas tags principais e eu tenho um conjunto de valores de SubTag1 para buscar os blocos de tags principais correspondentes, como no exemplo acima (a ser criado em um único arquivo XML resultante). Seria apropriado se o usuário do script puder fornecer o conjunto de valores de subTag1 para pesquisa em SOURCE.XML.

Eu pensei em usar o grep, mas isso não ajudará na seleção de tags. Eu preciso fazer isso usando o shell script do UNIX.

    
por VRVigneshwara 08.07.2015 / 08:02

2 respostas

0

Você precisa de uma ferramenta de análise XML. xmlstarlet é o meu favorito. Depois de corrigir seu XML inválido, temos

$ xmlstarlet ed -d '//main_tag[subTag1 != 1300]' file.xml
<?xml version="1.0"?>
<root_tag>
  <main_tag>
    <subTag1>1300</subTag1>
    <subTag2>BBcycle</subTag2>
    <subTag3>55</subTag3>
  </main_tag>
</root_tag>

e

$ xmlstarlet ed -d '//main_tag[subTag1 != 1300 and subTag1 != 1299]' file.xml
<?xml version="1.0"?>
<root_tag>
  <main_tag>
    <subTag1>1299</subTag1>
    <subTag2>cfinfo</subTag2>
    <subTag3>43</subTag3>
  </main_tag>
  <main_tag>
    <subTag1>1300</subTag1>
    <subTag2>BBcycle</subTag2>
    <subTag3>55</subTag3>
  </main_tag>
</root_tag>

Eu acho esta página um tutorial útil para o xpath.

    
por 08.07.2015 / 13:09
0

eu iria com

grep -A 3 -B 1 '<subTag1>1300</subTag1>' infile.xml > outfile.xml

-A seleciona linhas após o contexto. -B seleciona linhas antes do contexto

, que gera bons resultados

<main tag>
<subTag1>1300</subTag1>
<subTag2>BBcycle</subTag2>
<subTag3>55</subTag3>
</main tag>
    
por 23.07.2015 / 07:53