0

私は以下のようなxmlファイルを持っています:

<tr>
   <td>data1</td>
   <td>data2</td>
</tr>

trタグを1行で表示したい:

<tr><td>data1</td><td>data2</td></tr>

また、これをxmlファイルのすべてのtrタグで機能させたいと思います。助けてください。

元の質問を編集しました。

4

4 に答える 4

2

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> 
于 2012-08-17T12:27:49.787 に答える
1

完全にナイーブなパーサーと実際のパーサーの間のどこかの解決策:

$xmlConetnts =~ s/\>\s*\n\s*\</></g;

> newline <これはただに置き換えます><

XMLはテキストデータを許可しないため<、CDATAセクションがない限り安全です。

于 2012-08-17T12:39:42.607 に答える
0

シンプル:HTML/出力に新しい行を入れないでください。

于 2012-08-17T10:40:37.427 に答える
0

この問題は、見た目ほど簡単ではありません。これを行うための単純なプログラムは、次のようになります。

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

于 2012-08-17T11:38:26.920 に答える