如何在XML标记之间的多行上查找文本

时间:2014-02-27 03:15:29

标签: xml regex perl xml-parsing

我有像这样的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文件是否包含换行符。

1 个答案:

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