簡體   English   中英

如何使用LibXML和Perl對XML條目進行排序?

[英]How can I sort XML entries with LibXML and Perl?

我正在使用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並將所需的值存儲在哈希中。 然后,我使用了一個簡單的sort來對散列進行排序,現在可以正常工作了。

一種方法是將您的reverse更改為sort語句(未經測試):

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') ) {
    ...
}

希望這個對你有幫助!

單純的排序可能會使不同時區的時間混亂:

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

在這里,第二次是第一次之后的3小時,但排在第一位。

我不確定您所說的“ wonky”是什么意思。 您的示例僅以rfc3339格式顯示時間戳。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM