Perl使用困难的Regex将String从XML写入File

时间:2012-05-25 11:48:14

标签: regex perl

我有一个XML文件,我需要使用Perl传输到列表(不使用XSLT)。

这是我的(简单地删除了10个以上的属性,以便于阅读!)XML:

...
<XMLTAG ID="1" name="NAME1" status="0" date1="24.05.2012 13:37:00" date2="25.05.2012 13:37:00" />
<XMLTAG ID="2" name="NAME2" status="1" date1="24.05.2012 13:37:00" date2="25.05.2012 13:37:00" />
<XMLTAG ID="3" name="NAME3" status="0" date1="24.05.2012 13:37:00" date2="25.05.2012 13:37:00" />
...

到目前为止我得到了什么:

my $input = in.xml;
my $output = out.txt;

# open input
open( INPUT, $input )
  || die "Can't find $input: $_";

# open output
open( OUTPUT, ">$output" )
  || die "Can't find $output: $_";

    # run until perl returns undef (at the end of the file)
    while (<INPUT>) {
        if ($_ == /date1=\"[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2} [0-5][0-9]:[0-5][0-9]:[0-5][0-9]\"/) {
        print OUTPUT $_;};
    }
    close(INPUT);
    close(OUTPUT);

输出文件应如下所示:

date1="24.05.2012 13:37:00"
date1="24.05.2012 13:37:01"
date1="24.05.2012 13:37:02"
...

提前致谢, 马利

5 个答案:

答案 0 :(得分:6)

use XML::LibXML qw();
my $dom = XML::LibXML->load_xml(location => 'in.xml');
printf qq(date1="%s"\n), $_->getAttribute('date1')
    for $dom->findnodes('//XMLTAG');

答案 1 :(得分:1)

您应该使用正确的XML解析模块。有许多可用的,但这是使用XML::Smart的解决方案。

这不是我会选择的解决方案,但我很想知道你为什么要注销XSLT?

use strict;
use warnings;

use XML::Smart;

my $input = 'in.xml';
my $output = 'out.txt';

open my $out, '>', $output or die qq(Can't open output file "$output": $!);

my $xml = XML::Smart->new($input);
my $text = $xml->{root}{XMLTAG};

my $xmltags = $xml->{root}{XMLTAG};

for my $tag (@$xmltags) {
  print $out qq(date1="$tag->{date1}"\n);
}

<强>输出

date1="24.05.2012 13:37:00"
date1="24.05.2012 13:37:00"
date1="24.05.2012 13:37:00"

答案 2 :(得分:1)

使用XML::XSH2

open in.xml ;
ls //@date1 ;

答案 3 :(得分:0)

尝试:

date1=\"(.*?)\"

对于你的正则表达式,它将进行非贪婪的搜索。

更新:

他们警告我不需要转义双引号,所以

date1="(.*?)"

会做的。

答案 4 :(得分:0)

您可以使用非贪婪的匹配,如下所示:

if ($_ =~ /(date1=".*?")/ ) {
       print OUTPUT "$1\n";
    }