我正在尋找決議 Wordpress 博客匯出 - 我已經在 3 個博客條目的示例輸出中成功使用了一些 XML::LibXML 代碼,但是我決定嘗試使用 XML:LibXML:Reader,因為我希望必須決議一個非常大的檔案,我擔心記憶體不足。
但是,我得到了一些額外的空白節點。
可以使用以下代碼和 XML 檔案來演示該問題:
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use XML::LibXML::Reader;
my $filename = $ARGV[0];
my $reader = XML::LibXML::Reader->new(location => $filename) or die;
my $entry_pattern = 'XML::LibXML::Pattern'->new('/rss/channel/item');
while ($reader->nextPatternMatch($entry_pattern)) {
say "MATCH";
my $item = $reader->copyCurrentNode(1);
say $item;
say 'Title: ', $item->findvalue('./title');
say "";
}
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>Blog</title>
<item><title>Title 1</title></item>
<item><title>Title 2</title></item>
</channel>
</rss>
得到的輸出:
MATCH
<item><title>Title 1</title></item>
Title: Title 1
MATCH
<item/>
Title:
MATCH
<item><title>Title 2</title></item>
Title: Title 2
MATCH
<item/>
Title:
注意額外的<item/>匹配。這些從何而來?我怎樣才能避免它們?
uj5u.com熱心網友回復:
似乎正在發生的是結束標簽正在匹配。像 ::Reader 這樣的拉/流決議器需要同時指示元素的開始和結束,所以這是有道理的。想象一下,如果我們->copyCurrentNode不被使用。
但是,我們確實使用->copyCurrentNode,所以我們不關心它們或想要它們。因此,我們只需使用以下命令跳過它們:
next if $reader->nodeType != XML_READER_TYPE_ELEMENT;
要么
next if $reader->nodeType == XML_READER_TYPE_END_ELEMENT;
演示:
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use XML::LibXML::Reader qw( XML_READER_TYPE_ELEMENT);
my $filename = $ARGV[0];
my $reader = XML::LibXML::Reader->new( location => $filename );
my $entry_pattern = 'XML::LibXML::Pattern'->new( '/rss/channel/item' );
while ( $reader->nextPatternMatch($entry_pattern) ) {
next if $reader->nodeType != XML_READER_TYPE_ELEMENT;
say "MATCH";
my $item = $reader->copyCurrentNode(1);
say $item;
say 'Title: ', $item->findvalue( './title' );
say "";
}
MATCH
<item><title>Title 1</title></item>
Title: Title 1
MATCH
<item><title>Title 2</title></item>
Title: Title 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/450432.html
下一篇:curlapi決議
