2

Perl を使用して (XSLT を使用せずに) リストに転送する必要がある XML ファイルがあります。

これは私の (簡略化され、読みやすくするために 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 に答える