Como formatar atributos xml, não apenas elementos

1

Como você formata um documento XML para facilitar a leitura dos atributos do elemento?

Eu tenho um webservice baseado em xml que retorna um ou dois elementos, mas com centenas de atributos. Como estou desenvolvendo, às vezes preciso depurar este serviço, mas pode ser difícil, já que a saída é apenas um blob.

Considere isso:

$ echo '<root><foo z="26" y="25" x="24" a="1" b="2" c="3" d="something more"/></root>' | xmllint --format -
<?xml version="1.0"?>
<root>
  <foo z="26" y="25" x="24" a="1" b="2" c="3" d="something more"/>
</root>

Descobri que tr funciona muito bem, mas não é ideal:

$ echo '<root><foo z="26" y="25" x="24" a="1" b="2" c="3" d="something more"/></root>' | xmllint --format - | tr ' ' \\n
<?xml
version="1.0"?>
<root>


<foo
z="26"
y="25"
x="24"
a="1"
b="2"
c="3"
d="something
more"/>
</root>

Idealmente, a saída seria algo entre o xmllint e um hack funky

<?xml version="1.0"?>
<root>
  <foo
    z="26"
    y="25"
    x="24"
    a="1"
    b="2"
    c="3"
    d="something more"/>
</root>

Dessa forma, eu posso buscar coisas, classificar ou qualquer outra coisa.

    
por mlathe 22.04.2014 / 01:28

2 respostas

1

Eu recomendo strongmente que o grep / sed não funcione - eles não funcionam para XML.

Mas, felizmente, perl e XML::Twig get_xpath funciona muito bem para extrair um valor ou você tem twig_handlers para manipular elementos dependendo do caso de uso. (Ou apenas iterar usando children ou similar).

Mas de qualquer forma - para formatar seu XML:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new(
    pretty_print  => 'nsgmls',
);
$twig->parse (\*DATA);
$twig->print;


__DATA__
<?xml version="1.0"?>
<root>
  <foo
    z="26"
    y="25"
    x="24"
    a="1"
    b="2"
    c="3"
    d="something more"/>
</root>

em nsgmls printing, isso dá:

<?xml version="1.0"?>
<root
><foo
a="1"
b="2"
c="3"
d="something more"
x="24"
y="25"
z="26"
/></root>

indented_a oferece:

<?xml version="1.0"?>
<root>
  <foo
      a="1"
      b="2"
      c="3"
      d="something more"
      x="24"
      y="25"
      z="26"
  />
</root>

Qual parece ser bem próximo do que você está procurando?

    
por 12.05.2015 / 10:53
0

Você pode usar a fantástica biblioteca Python do BeautifulSoup. Essa amostra de código recupera um arquivo XML de uma URL fornecida como argumento de entrada para o script, analisa-o usando LXML e depois imprime bem.

#!/usr/bin/env python
import sys
import urllib2
import bs4

soup = bs4.BeautifulSoup(urllib2.urlopen(sys.argv[1]), ["lxml", "xml"])
print(soup.prettify())

Se você não tiver acesso ao LXML, poderá tentar sem ["lxml", "xml"] , embora isso analise os dados como HTML, em vez de XML, e não seja o modo adequado.

    
por 12.05.2015 / 11:37