要素の属性を読みやすくするために、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したり、並べ替えたりすることができます。
Grep/sedは使用しないことを強くお勧めします。XMLでは機能しません。
しかし幸いなことに、Perl
と XML::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>
あなたが探しているものにかなり近いと思われるのはどれですか?
素晴らしい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でデータを解析するため、適切な方法ではありません。