我正在试图弄清楚如何循环使用XML但我已经阅读了很多内容而且我仍然陷入困境。这是信息:
我正在使用wordnik api通过XML :: Simple检索XML:
$content = get($url);
$r = $xml->XMLin("$content");
实际的XML如下所示:
<definitions>
−
<definition sequence="0" id="0">
−
<text>
To withdraw one's support or help from, especially in spite of duty, allegiance, or responsibility; desert: abandon a friend in trouble.
</text>
<headword>abandon</headword>
<partOfSpeech>verb-transitive</partOfSpeech>
</definition>
−
<definition sequence="1" id="0">
−
<text>
To give up by leaving or ceasing to operate or inhabit, especially as a result of danger or other impending threat: abandoned the ship.
</text>
<headword>abandon</headword>
<partOfSpeech>verb-transitive</partOfSpeech>
</definition>
−
<definition sequence="2" id="0">
−
<text>
To surrender one's claim to, right to, or interest in; give up entirely. See Synonyms at relinquish.
</text>
<headword>abandon</headword>
<partOfSpeech>verb-transitive</partOfSpeech>
</definition>
−
<definition sequence="3" id="0">
...
我想要的只是FIRST定义的部分内容。我正在使用此代码,但它获得了LAST定义的POS:
if($r->{definition}->{0}->{partOfSpeech}) {
$pos = $r->{definition}->{0}->{partOfSpeech};
}
else { $pos = $r->{definition}->{partOfSpeech}; }
我很尴尬,因为我知道有一个明显更好的方法。我很想得到像这样简单的东西,所以我可以更一般地循环元素。坚持它只是不适合我(不知道该引用什么)。我尝试过以下几种变体 - 这只是我最后一次尝试:
while (my ($k, $v) = each %{$r->{definitions}->{definition}[0]->{sequence}->{partOfSpeech}}) {
$v =~ s/'/'"'"'/g;
$v = "'$v'";
print "export $k=$v\n";
}
最后,当我做“打印翻车机($ r)”时,它给了我这个:
$VAR1 = {
'definition' => {
'0' => {
'partOfSpeech' => 'noun',
'sequence' => '6',
'text' => 'A complete surrender of inhibitions.',
'headword' => 'abandon'
}
}
};
(你看到的那个“名词”是最后一个(第6个)定义/ partofspeech元素)。
根据RC的答案,我的新代码如下:
$content = get($url);
$r = $xml->XMLin("$content", KeyAttr => { definition => 'sequence'});
while (my ($k, $v) = each %{$r->{definition}}) {
$v=$r->{definition}->{$k}->{partOfSpeech};
print "export $k=$v\n";
}
这打印出以下内容:
export 6='noun'
export 4='verb-transitive'
export 1='verb-transitive'
export 3='verb-transitive'
export 0='verb-transitive'
export 2='verb-transitive'
export 5='noun'
所以这很好,它正在导出正确的对。但现在问题是订单已关闭(这似乎很可能是Wordnik的问题,而不是编程问题)。我如何用钥匙对它进行排序?像这样的东西?
sort($r->{definition});
答案 0 :(得分:3)
来自XML::Simple doc:
注1:默认值 'KeyAttr'是['name','key','id']。如果 你不想在输入或折叠上折叠 在输出上展开你必须设置 此选项为空列表 禁用该功能。
我认为将KeyAttr => { definition => 'sequence' }
添加到XMLin
选项可能会解决您的问题。
答案 1 :(得分:3)
也可以使用XML::Twig为您遍历文件并帮助提取数据:
use XML::Twig;
my $content = do { local $/; <DATA> }; # get data
XML::Twig->new(twig_handlers => {
definition => sub {
warn "---\n",
"sequence = ", $_->att('sequence'), "\n",
"text = ", $_->first_child_trimmed_text('text'), "\n",
"headword = ", $_->first_child_trimmed_text('headword'), "\n",
"partOfSpeech = ", $_->first_child_trimmed_text('partOfSpeech'), "\n";
$_->purge;
},
})->parsestring($content);
这也更有效,因为整个结构不必加载到内存中(purge
方法正在为您清理处理过的数据)。
答案 2 :(得分:0)
你可以尝试WWW::Wordnik::API(我是作者。)