私は以下のようなxmlファイルを持っています:
<tr>
<td>data1</td>
<td>data2</td>
</tr>
trタグを1行で表示したい:
<tr><td>data1</td><td>data2</td></tr>
また、これをxmlファイルのすべてのtrタグで機能させたいと思います。助けてください。
元の質問を編集しました。
XML :: Twigでこれを行うことができます:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
XML::Twig->new( keep_spaces => 1, # keep the original formating
# but remove text in tr (ie whitespace)
twig_handlers => { tr => sub { $_->cut_children( '#TEXT') } }
)
->parse( \*DATA)
->print;
__DATA__
<html>
<head><title>a title</title></head>
<body>
<h1>example data</h1>
<table>
<tr>
<td>data1</td>
<td>data2</td>
</tr>
<tr>
<td>data1</td>
<td>data2</td>
</tr>
</table>
</body>
</html>
完全にナイーブなパーサーと実際のパーサーの間のどこかの解決策:
$xmlConetnts =~ s/\>\s*\n\s*\</></g;
> newline <
これはただに置き換えます><
XMLはテキストデータを許可しないため<
、CDATAセクションがない限り安全です。
シンプル:HTML/出力に新しい行を入れないでください。
この問題は、見た目ほど簡単ではありません。これを行うための単純なプログラムは、次のようになります。
use strict;
use warnings;
while ( my $line = <DATA> ) {
if ( $line =~ /<tr>/ ) {
while ( $line !~ /<\/tr>/ ) {
chomp $line;
$line =~ s/^\s+//;
print $line;
$line = <DATA>;
}
print "\n";
}
print $line;
}
__DATA__
<foo>
foo
</foo>
<tr>
<td>data1</td>
<td>data2</td>
</tr>
<bar>
bar
</bar>
ただし、これは、ファイルがプログラムを優先してフォーマットされ、問題のタグがネストされていない場合にのみ機能します。XMLパーサーを調べて、そのためのカスタムのきれいなプリンターを作成することをお勧めします。出発点は、モジュールを研究することかもしれませんXML::Parser