【问题标题】:How can I find text on more than one line between XML tags如何在 XML 标记之间的多行上查找文本
【发布时间】:2014-03-30 06:42:03
【问题描述】:

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

【问题讨论】:

  • “输入标记”是什么意思?
  • Entet 标记表示在键盘中输入字符,每个 xml 标记的新行。
  • 您的意思是要提取多行 XML 元素的值吗?然后你不会逐行解析文件。对不起,我对英语的理解力下降了。
  • 查找 (.*?) 之间的所有标签并写入文本输出文件,但我的脚本只工作 xml 包含每个标签没有新行。
  • 使用真正的 XML 库。

标签: xml regex perl xml-parsing


【解决方案1】:

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

【讨论】:

  • 仅用于解析 xml 提取文本。
  • 是的,用于提取文本,it's a bad idea to use regexps
  • 你能举一些例子说明什么时候会失败吗?
  • 例如,当您有包含&lt;DBCONNECTION&gt;CDATA 元素时,标签中有空格时,当同名标签嵌套时(&lt;DB&gt;...stuff1&lt;DB&gt;more stuff2&lt;/DB&gt; end of stuff 1&lt;/DB&gt;)等等。相信我们,使用一个真正的图书馆。
猜你喜欢
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多