web-dev-qa-db-ja.com

要素だけでなく、xml属性をフォーマットする方法

要素の属性を読みやすくするために、XMLドキュメントをどのようにフォーマットしますか?

1つまたは2つの要素を返すxmlベースのWebサービスがありますが、数百の属性があります。開発を行っているときに、このサービスをデバッグする必要がある場合がありますが、出力が1つのBLOBであるため、難しい場合があります。

このことを考慮:

$ 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>

Trはかなりうまく機能しますが、理想的ではないことがわかりました。

$ 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>

理想的には、出力はxmllintとファンキーなハックの間の何かになります

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

そうすれば、私は物事をgrepしたり、並べ替えたりすることができます。

1
mlathe

Grep/sedは使用しないことを強くお勧めします。XMLでは機能しません。

しかし幸いなことに、PerlXML::Twig 必要に応じて値を再フォーマットおよび抽出するためのあらゆる種類の魔法があります。 get_xpathは値を抽出するためにうまく機能します、またはあなたはtwig_handlersユースケースに応じて要素を処理します。 (または、childrenなどを使用して繰り返します)。

しかしとにかく-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>

nsgmls印刷では、次のようになります。

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

indented_a あなたにあげる:

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

あなたが探しているものにかなり近いと思われるのはどれですか?

1
Sobrique

素晴らしいBeautifulSoup Pythonライブラリを使用できます。このコードサンプルは、スクリプトへの入力引数として指定されたURLからXMLファイルを取得し、LXMLを使用して解析し、きれいに出力します。

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

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

LXMLにアクセスできない場合は、["lxml", "xml"]なしで試すことができますが、これはXMLではなくHTMLでデータを解析するため、適切な方法ではありません。

0
Benjamin B.