gpt4 book ai didi

xml - 如何使用 LibXML 和 Perl 对 XML 条目进行排序?

转载 作者:数据小太阳 更新时间:2023-10-29 02:21:32 26 4
gpt4 key购买 nike

我正在用 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') ) {
...
}

希望对您有所帮助!

关于xml - 如何使用 LibXML 和 Perl 对 XML 条目进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/990579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com