![](/img/trans.png)
[英]How can I parse multiple xml-files into one DOM object using perl XML::LibXML?
[英]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.