使用XML中的最新日期时间更新节点属性



我有以下XML:

< measCollecFile>
    < fileHeader>
            < measCollec beginTime="2013-03-14T12:10:00+00:00" />
    </ fileHeader>
    < measData>
            < measInfo>
                    < granPeriod duration="PT300S" endTime="2013-03-14T12:15:00+00:00"  />
                    < measType>VS.ave</measType>
                    < measType>VS.aveCPU</measType>
                    < measValue>VS1</measValue>
                    < measValue>VS2</measValue>
            </ measInfo>
    </ measData>
</ measCollecFile>

Q: 我的问题我需要处理这个XML文件并修改某些元素中的一些数据。我能够在这个网站的帮助下做到这一点,你可以从我以前的帖子中看到。

这是一个新的挑战。正如您所看到的,XML中也有datetime元素。我需要将其更新为当前日期时间,格式与XML中显示的格式相同。即XML将始终包含任何日期,我只想找到日期时间标记并将其更新为当前日期时间,但它应该与其中的格式相同。

我应该把它当作一个单独的问题,当作一个简单的正则表达式Perl问题来处理,并相应地作为一个平面文件来解决查找和替换问题吗?

或者LIBXML内置了任何东西来识别日期时间标记并用最新日期时间更新它?

识别"datetime"标记没有什么特别的。你当然可以寻找适合特定格式的属性,但这真的是你想要的吗?

使用XML::LibXMLTime::Piece将beginTime替换为当前日期:

use strict;
use warnings;
use XML::LibXML;
use Time::Piece;
my $date_format = '%Y-%m-%dT%H:%M:%S';
my $data = do { local $/; <DATA> };
my $dom = XML::LibXML->load_xml(string => $data);
for my $node ($dom->findnodes('//*[@beginTime]')) {
    if ( my $begin = $node->getAttribute('beginTime') ) {
        my ($plaindate, $tz) = split '(?=+)', $begin;
        my $date = Time::Piece->strptime($plaindate, $date_format);
        print "old beginTime = '$date'n";
        my $newdate = localtime->strftime($date_format);
        $node->setAttribute('beginTime', $newdate . $tz);
    }
}
print $dom->toString();
__DATA__
<measCollecFile>
    <fileHeader>
        <measCollec beginTime="2013-03-14T12:10:00+00:00" />
    </fileHeader>
    <measData>
        <measInfo>
            <granPeriod duration="PT300S" endTime="2013-03-14T12:15:00+00:00"  />
            <measType>VS.ave</measType>
            <measType>VS.aveCPU</measType>
            <measValue>VS1</measValue>
            <measValue>VS2</measValue>
        </measInfo>
    </measData>
</measCollecFile>

要同时更新beginTime和endTime,可以创建一个更复杂的xpath:

my @attribs = qw(beginTime endTime);
my $attribs_list = join ' | ', map {'@'.$_} @attribs;
for my $node ($dom->findnodes("//*[$attribs_list]")) {
    for my $key (@attribs) {
        if ( my $att = $node->getAttribute($key) ) {
            my ($plaindate, $tz) = split '(?=+)', $att;
            my $date = Time::Piece->strptime($plaindate, $date_format);
            print "old $key = '$date'n";
            my $newdate = localtime->strftime($date_format);
            $node->setAttribute($key, $newdate . $tz);
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新