我有一个如下的xml文件:
<tr>
<td>data1</td>
<td>data2</td>
</tr>
我想在一行中显示 tr 标签:
<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