0

我有一个如下的xml文件:

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

我想在一行中显示 tr 标签:

<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 回答