我有像这样的xml数据
<DBCONNECTION>
<SERVER>1111111</SERVER>
<DBNAME>222222222</DBNAME>
<USER>333333333333</USER>
<PASSWORD>444444444</PASSWORD>
<TABLENAME>5555555555</TABLENAME>
</DBCONNECTION>
<DBCONNECTION>
<SE>ABC</SERVER>
<DBNAME>DEF</DBNAME>
<USER>GHI</USER>
<PASSWORD>JKL</PASSWORD>
<TABLENAME>MNO</TABLENAME>
</DBCONNECTION>
我在标签
之间写了perl提取文本#!/usr/bin/perl
@files = <*.xml>;
open my $out, '>', 'output.xml' or die $!;
foreach $file (@files) {
open (FILE, "$file");
while($line= <FILE> ){
if ($line =~ /<DBCONNECTION>(.*?)<\/DBCONNECTION>/)
{
$a=$1;
print $out("$a\n");
}
}
close FILE;
}
但是当XML标记之间没有换行符时,这种方法很有效。现在我想查找标签并提取XML文件是否包含换行符。
答案 0 :(得分:2)
Never use regular expressions to parse HTML (or XML for that matter).
使用像XML::Twig这样的专业库。
如果你坚持(其他人 - 不这样做),你可以读取内存中的整个文件,然后运行正则表达式。它会在各种情况下失败,但你已经被警告了几次。
#!/usr/bin/perl
use strict; # also, learn to use strict
undef $/; # no line separator; slurp files entirely in memory
my @files = <*.xml>;
open my $out, '>', 'output.xml' or die $!;
foreach my $filename (@files) {
open my $file, '<', $filename or die $!;
my $contents = <$file>;
while ($contents =~ /<DBCONNECTION>(.*?)<\/DBCONNECTION>/sg) { # note the /sg
print $1, "\n";
}
close $file;
}
要了解/ sg在正则表达式末尾的作用,请阅读http://perldoc.perl.org/perlre.html#Modifiers