【问题标题】:XML parsing issue in PerlPerl 中的 XML 解析问题
【发布时间】:2011-10-11 20:03:36
【问题描述】:

我正在尝试解析 XML 文件中的抽象部分。我正在使用forcearray。我编写了代码,但是当抽象在数组中时它只是工作,而当数组不存在时它不工作。这是因为在数组中我也使用 {content} 而当不在数组中时 {content} 丢失。代码如下

use LWP::Simple;
use XML::Simple;
use Data::Dumper;

open (FH, ">:utf8","xmlparsed2.txt");

my $db1 = "pubmed";
my $query  = "9915366";
my $q = 16404398;
my $xml = new XML::Simple;

$urlxml = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=$db1&id=$q&retmode=xml&rettype=abstract";
$dataxml = get($urlxml);
$data = $xml->XMLin("$dataxml", ForceArray => [qw( MeshHeading Author AbstractText )], ForceContent => 1);
print FH Dumper($data);

print FH "Abstract: ".join "\n", map {join ":",($_->{NlmCategory},$_->{content})} @{$data->{PubmedArticle}->{MedlineCitation}->{Article}->{Abstract}->{AbstractText}};
print FH "\n";
print FH "Title: "."$data->{PubmedArticle}->{MedlineCitation}->{Article}->{ArticleTitle}\n";
print FH "\n";
print FH "MeSH: ".join '$$', map $_->{DescriptorName}{content}, @{$data->{PubmedArticle}->{MedlineCitation}->{MeshHeadingList}->{MeshHeading}};
print FH "\n";
print FH "Authors: ".join '$$', map {join " ",($_->{LastName},$_->{ForeName})} @{$data->{PubmedArticle}{MedlineCitation}{Article}{AuthorList}{Author}};

好吧,当在数组中时(replcae $q in $urlxml by $query)我想要具有 NlmCategory 的抽象,如 目标:确定是否长......。对于上面的代码,它给了我想要的输出,但最后带有散列,如下所示:

METHODS:Tertiary care outpatient and inpatient rehabilitation center directly attached to a university hospital.:HASH(0x69d0810).

对于不是数组的抽象($urlxml 中的 $q),此代码似乎不起作用,可能是因为没有内容术语(我在数据转储器中找到了这个)。我玩了一点,如果我只为数组执行 $_ 之类的操作,但也打印两个 :​​:.简而言之,我希望我的代码同时适用于 $query 和 $q。你能帮忙吗?

【问题讨论】:

    标签: xml perl parsing


    【解决方案1】:

    使用ForceContent => 1

    或者:

    use strict;
    use warnings;
    use feature qw( say );
    
    use LWP::Simple qw( get );
    use XML::LibXML qw( );
    use URI         qw( );
    
    binmode STDOUT, ':encoding(UTF-8)';
    
    my $db = "pubmed";
    my $id = $ARGV[0] || '9915366';
    
    my $url = URI->new('http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi');
    $url->query_form(
       db      => $db,
       id      => $id,
       retmode => 'xml',
       rettype => 'abstract',
    );
    
    my $xml = get($url);
    
    my $parser = XML::LibXML->new();
    my $doc = $parser->parse_string($xml);
    my $root = $doc->documentElement();
    
    for my $node ($root->findnodes('PubmedArticle/MedlineCitation/Article/Abstract/AbstractText')) {
       say join ':', $node->getAttribute('NlmCategory') // '', $node->textContent();
    }
    

    【讨论】:

    • 哎呀..很高兴在这里见到你。好吧,我现在正试图正确地提出问题。谢谢您的帮助。好的,谢谢你的代码,但我已经有一个代码,其中包含其他内容,可以与摘要一起提取。坦率地说,我是一个初学者,了解代码的基本知识确实需要很长时间。我只是不想这样做,因为我正在这样做,我想学习一些东西。所以,我有点理解这段代码,但我会开始在里面寻找一些东西,然后修改我的原始代码,这需要很长时间。所以,我会选择你的第一个答案。
    • 我厌倦了使用上面代码中编辑的 forceconten=>1 但是我也试图提取其他也在上面代码中编辑的东西。当我使用 forcecontent 时,我的其他事情都搞砸了,这些事情不是通过内容来的。此外,我将为我拥有的所有 id 集循环此代码。我希望我很清楚。
    • @smandape,所以在需要的地方添加->{content},如您创建的转储所示。
    • @smandape,顺便说一下,我展示了 XML::Simple 的替代方案,因为 XML::Simple 是最难正确使用的 XML 解析器。
    • 感谢您的帮助。这真的奏效了。好吧,我还将尝试 XML::Simple 的替代方法。谢谢您的帮助。非常感谢。
    猜你喜欢
    • 2012-02-11
    • 1970-01-01
    • 2011-08-08
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多