Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl计算XML文件中暂停内的值_Xml_Perl - Fatal编程技术网

如何使用Perl计算XML文件中暂停内的值

如何使用Perl计算XML文件中暂停内的值,xml,perl,Xml,Perl,我有一个包含以下信息的XML文件: <Key Time="54288" Type="insert" Value="E" /> <Key Time="55288" Type="insert" Value="A" /> <Key Time="58298" Type="insert" Value="H" /> <Key Time="58398" Type="insert" Value="A" /> <Key Time="58498" Type="i

我有一个包含以下信息的XML文件:

<Key Time="54288" Type="insert" Value="E" />
<Key Time="55288" Type="insert" Value="A" />
<Key Time="58298" Type="insert" Value="H" />
<Key Time="58398" Type="insert" Value="A" />
<Key Time="58498" Type="insert" Value="L" />
<Key Time="59298" Type="insert" Value="L" />    
<Key Time="64298" Type="insert" Value="O" />
这个输出

3010 started at 55288
5000 started at 59298
但是,现在我需要改进脚本,以检索两次>=2400长暂停之间的所有值,还包括暂停开始处的值。例如,从
Time=“54288”
Time=“55288”
我有
EA
;从
Time=“58298”
Time=“59298”
我有
HALL
等等。

这就是我认为您可能想要的,即生成
值的属性列表,以超过40分钟的暂停间隔

我使用了一个合适的XML解析器模块来完成这项工作。使用正则表达式解析XML是自找麻烦

use strict;
use warnings;

use XML::Twig;

my @nums;
my $start_time;
my @blocks = ( '' );

my $twig = XML::Twig->new(
   twig_handlers => { Key => \&key_handler }
);
$twig->parse(*DATA);

print "$_\n" for @blocks;

sub key_handler {
  my ($twig, $key) = @_;
  my $time = $key->{att}{Time};

  if (defined $start_time) {
    my $pause = $time - $start_time; 
    push @blocks, ("$pause from $start_time to $time", '') if $pause >= 2400;
  }

  $start_time = $time;
  $blocks[-1] .= $key->{att}{Value};
}

__DATA__
<root>
  <Key Time="54288" Type="insert" Value="E" />
  <Key Time="55288" Type="insert" Value="A" />
  <Key Time="58298" Type="insert" Value="H" />
  <Key Time="58398" Type="insert" Value="A" />
  <Key Time="58498" Type="insert" Value="L" />
  <Key Time="59298" Type="insert" Value="L" />    
  <Key Time="64298" Type="insert" Value="O" />
</root>

为Borodin建模的解决方案,但使用:

使用严格;
使用警告;
使用XML::LibXML;
my$string=do{local$/;};
my$dom=XML::LibXML->load_-XML(string=>$string);
我的@blocks='';
我上次的美元;
对于我的$node($dom->findnodes('//Key')){
我的$time=$node->getAttribute('time');
if(定义为$lasttime){
my$pause=$time-$lasttime;
如果$pause>=2400,则按@blocks,“从$lasttime暂停到$time”;
}
$blocks[-1]。=$node->getAttribute('Value');
$lasttime=$time;
}
为@blocks打印“$\un”;
__资料__

我不明白。您现有的脚本将找到从A到H和从L到O的暂停,对吗?因此,如果你的新脚本应该找到从暂停开始到暂停结束的字母,那么你肯定会得到AHAL?顺便说一句,为了理解你的问题,便于检查答案,编辑问题并使用唯一的字母可能更好@马克:我想我们需要的是一个
属性列表,这些属性之间用间隔>=2400分隔,因此
EA
霍尔
O
。至少我的答案是这样的!如果是这样,则创建
HALL
的范围的最终值中存在键入错误,该值应为
59298
,而不是
64298
。我已经解决了这个问题,希望我是对的。@ials:任何长度超过几个简短语句的内容都应该作为程序放入文件中。“长的命令行程序不能很好地工作,尤其是在调试方面。这正是我想要的,”博罗丁说。非常感谢。我做了一个更改,从XML文件中获取数据,而不是将其包含在脚本文件[$twig->parsefile('myFile.XML');]中。但是,我想知道如何能够同时处理一批XML文件,并获得一个文件,其结果与原始文件一致?@ials:这是一个不同的问题,应该这样提出。你对编程知之甚少,以至于你无法将该算法嵌入(@ARGV){…}
中吗?我是新手,@Borodin。。。编程实际上不是我的工作领域,但我有时需要。。。我会在(@ARGV)上试试你的提示。非常感谢你的帮助。
use strict;
use warnings;

use XML::Twig;

my @nums;
my $start_time;
my @blocks = ( '' );

my $twig = XML::Twig->new(
   twig_handlers => { Key => \&key_handler }
);
$twig->parse(*DATA);

print "$_\n" for @blocks;

sub key_handler {
  my ($twig, $key) = @_;
  my $time = $key->{att}{Time};

  if (defined $start_time) {
    my $pause = $time - $start_time; 
    push @blocks, ("$pause from $start_time to $time", '') if $pause >= 2400;
  }

  $start_time = $time;
  $blocks[-1] .= $key->{att}{Value};
}

__DATA__
<root>
  <Key Time="54288" Type="insert" Value="E" />
  <Key Time="55288" Type="insert" Value="A" />
  <Key Time="58298" Type="insert" Value="H" />
  <Key Time="58398" Type="insert" Value="A" />
  <Key Time="58498" Type="insert" Value="L" />
  <Key Time="59298" Type="insert" Value="L" />    
  <Key Time="64298" Type="insert" Value="O" />
</root>
EA
3010 from 55288 to 58298
HALL
5000 from 59298 to 64298
O
use strict;
use warnings;

use XML::LibXML;

my $string = do {local $/; <DATA>};

my $dom = XML::LibXML->load_xml(string => $string);

my @blocks = '';

my $lasttime;
for my $node ($dom->findnodes('//Key')) {
    my $time = $node->getAttribute('Time');

    if (defined $lasttime) {
        my $pause = $time - $lasttime;
        push @blocks, "pause from $lasttime to $time", '' if $pause >= 2400;
    }
    $blocks[-1] .= $node->getAttribute('Value');
    $lasttime = $time;
}

print "$_\n" for @blocks;

__DATA__
<root>
  <Key Time="54288" Type="insert" Value="E" />
  <Key Time="55288" Type="insert" Value="A" />
  <Key Time="58298" Type="insert" Value="H" />
  <Key Time="58398" Type="insert" Value="A" />
  <Key Time="58498" Type="insert" Value="L" />
  <Key Time="59298" Type="insert" Value="L" />    
  <Key Time="64298" Type="insert" Value="O" />
</root>