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

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

要素属性を読みやすくするために、XML文書の形式をどのように指定しますか?

1つまたは2つの要素を返しますが、何百もの属性を持つXMLベースのWebサービスがあります。開発時には時々このサービスをデバッグする必要がありますが、出力はただブロブなので難しいかもしれません。

考えてみてください:

$ 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とfunky hackの間にあります。

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

これにより、物を探したりソートしたりすることができます。

ベストアンサー1

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>

これがあなたが探しているものとかなり近いようですか?

おすすめ記事