Análise XML usando xmllint e customizando a saída

1

Eu tenho o arquivo xml (digamos input.xml) do seguinte esquema:

<?xml version="1.0"?>
  <TagA>
    <TagB>
      <File Folder="FOLDER1M" File="R1.txt" />
    </TagB>
    <TagB>
      <File Folder="FOLDER1M" File="R2.txt" />
    </TagB>
    <TagB>
      <File Folder="FOLDER2M" File="R3.txt" />
    </TagB>
  </TagA>

Eu preciso analisar esse arquivo e gravar a saída em outro arquivo. A saída necessária deve ter o seguinte formato:

www.xyz.com\FOLDER1M\R1.txt
www.xyz.com\FOLDER1M\R2.txt
www.xyz.com\FOLDER2M\R3.txt

O que eu tenho até agora é:

echo 'cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]' | xmllint --shell input.xml | grep '=' > xml_parsed

Isso me dá o / p do formulário:

/ > cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]
Folder="FOLDER1M"
File="R1.txt"
Folder="FOLDER1M"
File="R2.txt"
Folder="FOLDER2M"
File="R3.txt"

Como devo proceder para obter o resultado exigido em vez deste atual o / p?

    
por NGambit 16.04.2013 / 21:38

1 resposta

1

Aqui está uma maneira de fazer isso. Acabei de colocar sua saída em um arquivo chamado sample.txt para facilitar o teste, basta anexar meus comandos ao final do seu comando echo:

exemplo.txt

Folder="FOLDER1M"
File="R1.txt"
Folder="FOLDER1M"
File="R2.txt"
Folder="FOLDER2M"
File="R3.txt"

comando

% cat sample.txt | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\/' | sed 's/^/www.xyz.com\/'

Divisão do comando

junte-se a cada duas linhas juntas

# sed 'h;s/.*//;G;N;s/\n//g'
Folder="FOLDER1M"File="R1.txt"
Folder="FOLDER1M"File="R2.txt"
Folder="FOLDER2M"File="R3.txt"

tira a pasta = & "

# sed 's/Folder=\|"//g'
FOLDER1MFile=R1.txt
FOLDER1MFile=R2.txt
FOLDER2MFile=R3.txt

Substituir arquivo = por um '\'

# sed 's/File=/\/'
FOLDER1M\R1.txt
FOLDER1M\R2.txt
FOLDER2M\R3.txt

insira www.xyz.com

# sed 's/^/www.xyz.com\/'
www.xyz.com\FOLDER1M\R1.txt
www.xyz.com\FOLDER1M\R2.txt
www.xyz.com\FOLDER2M\R3.txt

EDIT # 1

O OP atualizou sua pergunta perguntando como modificar minha resposta para excluir a primeira linha de saída, por exemplo:

/ > cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]
...
...

Eu mencionei a ele que você pode usar grep -v ... para filtrar as linhas que não são relevantes da seguinte forma:

% cat sample.txt | grep -v "/ >" | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\/' | sed 's/^/www.xyz.com\/'

Além disso, para gravar o bit inteiro em um arquivo, isso pode ser feito da seguinte forma:

% cat sample.txt | grep -v "/ >" | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\/' | sed 's/^/www.xyz.com\/' > /path/to/some/file.txt
    
por 17.04.2013 / 00:07