2

我有一个 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"
...

在此先感谢,马利

4

5 回答 5

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');
于 2012-05-25T12:16:00.550 回答
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"
于 2012-05-25T12:18:46.057 回答
1

使用XML::XSH2

open in.xml ;
ls //@date1 ;
于 2012-05-25T12:35:08.450 回答
0

尝试:

date1=\"(.*?)\"

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

更新:

他们警告我没有必要转义双引号,所以

date1="(.*?)"

会做。

于 2012-05-25T12:06:34.860 回答
0

您可能会使用非贪婪匹配,如下所示:

if ($_ =~ /(date1=".*?")/ ) {
       print OUTPUT "$1\n";
    }
于 2012-05-25T13:15:54.873 回答