【发布时间】:2014-05-24 21:38:47
【问题描述】:
use XML::LibXML;
use Data::Dumper;
#parsing file
my $dom = XML::LibXML->new->parse_file('sample.xml');
#print file to make sure it looks ok
print $dom, "\n";
#finds shortnames
my $sn = $dom->findnodes('//shortName');
print 'ShortName: '.$sn, "\n";
#finds dbRefernce ids that are of type EC
my $ids = $dom->findnodes('//dbReference[@type="EC"]/@id');
my $number =()= $ids =~ /\./gi;
print 'Result: '.$ids, "\n";
#finds sequences that have a length
my $seq = $dom->findnodes('//sequence[@length>1]');
$seq =~ s/" "/"\n"/;
print 'Sequence: '.$seq, "\n";
我有这段代码,它获取所有短名称、EC 类型的 dbReferences 和具有长度的序列并打印它们。我有 sample.xml (https://www.dropbox.com/s/dq8ir9f22cnfwrz/Sample.xml) 这是我最后需要解析的较大文件。但我一直在使用 oneentry.xml (https://www.dropbox.com/s/6nxexfig46sw0v6/oneentry.xml),它只是较大列表中的条目之一。
问题是代码适用于一个条目并打印出来:
ShortName: 17-beta-HSD 53-alpha-HSD type 2DD-3DD3PGFS
Result: 1.-.-.-1.1.1.3571.1.1.1121.1.1.1881.1.1.2391.1.1.641.3.1.20
Sequence: MDSKHQCVKLNDGHFMPVLGFGTYAPPEVPRSKALEVTKLAIEAGFRHIDSAHLYNNEEQ VGLAIRSKIADGSVKREDIFYTSKLWSTFHRPELVRPALENSLKKAQLDYVDLYLIHSPM SLKPGEELSPTDENGKVIFDIVDLCTTWEAMEKCKDAGLAKSIGVSNFNRRQLEMILNKP GLKYKPVCNQVECHPYFNRSKLLDFCKSKDIVLVAYSALGSQRDKRWVDPNSPVLLEDPV LCALAKKHKRTPALIALRYQLQRGVVVLAKSYNEQRIRQNVQVFEFQLTAEDMKAIDGLD RNLHYFNSDSFASHPNYPYSDEY
但它不会为整个文件输出任何内容。导致脚本功能不同的两个文件有什么不同?
【问题讨论】:
-
在我看来,这些数据只在上下文中有意义(在大文档中)。如果是这种情况,您将不得不考虑在选择节点时,因为
//simpleName将选择整个文档中的all 简单名称并将它们全部放在一起。我想您可能希望按entry对它们进行分组,例如:entry[name='AK1C3_HUMAN']//shortName将返回具有该孩子的entry的所有短名称。 -
这种选择在 XSLT 或 XQuery 中非常简单。
-
查看这个fiddle 会生成您正在寻找的结果。当您从数据(左上框)+ XSLT 样式表(左侧第二个框)中按
RUN时,会生成右侧表格中的 HTML。这是提取数据的另一种方法。