3

我正在使用LibXML解析 XML 文件,并且需要按日期对条目进行排序。每个条目都有两个日期字段,一个用于发布条目的时间,一个用于更新条目的时间。

<?xml version="1.0" encoding="utf-8"?>
...
<entry>
  <published>2009-04-10T18:51:04.696+02:00</published>
  <updated>2009-05-30T14:48:27.853+03:00</updated>
  <title>The title</title>
  <content>The content goes here</content>
</entry>
...

XML 文件已按更新日期排序,最新的在前。我可以轻松地将其反转以将较旧的条目放在首位:

my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($file);
my $xc = XML::LibXML::XPathContext->new($doc->documentElement());

foreach my $entry (reverse($xc->findnodes('//entry'))) {
  ...
}

但是,我需要按发布日期对文件进行反向排序,而不是按更新日期。我怎样才能做到这一点?时间戳看起来也有点奇怪。我需要先标准化吗?

谢谢!

更新:在摆弄 XPath 命名空间并失败后,我创建了一个函数来解析 XML 并将我需要的值存储在哈希中。然后我用一个baresort对哈希进行排序,现在效果很好。

4

2 回答 2

5

一种方法是将您更改reversesort声明(未经测试):

sub parse_date {
    # Transforms date from 2009-04-10T18:51:04.696+02:00 to 20090410
    my $date= shift;
    $date= join "", $date =~ m!\A(\d{4})-(\d{2})-(\d{2}).*!;
    return $date;
}

sub by_published_date {
    my $a_published= parse_date( $a->getChildrenByTagName('published') );
    my $b_published= parse_date( $b->getChildrenByTagName('published') );

    # putting $b_published in front will ensure the descending order.
    return $b_published <=> $a_published;
}

foreach my $entry ( sort by_published_date $xc->findnodes('//entry') ) {
    ...
}

希望这个对你有帮助!

于 2009-06-13T12:34:39.040 回答
2

裸排序可能会使来自不同时区的时间乱序:

 print for sort "2009-06-15T08:00:00+07:00", "2009-06-15T04:00:00+00:00";

在这里,第二次是在第一次之后 3 小时,但首先排序。

我不确定你所说的“古怪”是什么意思。您的示例仅显示rfc3339格式的时间戳。

于 2009-06-14T19:37:36.707 回答