我有一个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"
...
提前致谢, 马利
答案 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";
}