2015-09-22 21 views
-1

我正在使用XML:twig從使用Perl的XML文件中提取某些屬性;將來自兩個標籤的屬性打印在一起

這裏是我的代碼

use XML::Twig; 
my $file = $ARGV[0]; 
$file =~ /(.+)\.xml/; 
my $outfile = $1 . ".snp" ; 
open my $out, '>', $outfile or die "Could not open file '$outfile' $!"; 
my $twig = XML::Twig->new(
    twig_handlers => { 
     'Rs/MergeHistory' => \&MergeHistory, 
    } 
); 

$twig -> parsefile("$file"); 

sub MergeHistory { 
    my ($twig, $elt) = @_; 
    print $out "\t"; 
    print $out "rs"; 
    print $out $elt->att('rsId'), ","; 
    print $out "b"; 
    print $out $elt->att('buildId'), ","; 
} 

此打印以下結果:

rs56546490,b130, rs386588736,b142 
rs56546490,b130, rs386588736,b142 

我想是打印每MergeHistory RSID和buildId在一起,如下所示:

rs56546490,rs386588736, b130,b142 
rs56546490,rs386588736, b130,b142 

以下是包含在兩個MergeHistory標籤上的XML文件的一部分:

<Rs rsId="98324" snpClass="snp" snpType="notwithdrawn" 
    molType="genomic" genotype="true"bitField="050028000005130500030100" 
    taxId="9606"> 
    <Het type="est" value="0.05" stdError="0.1547"/> 
    <Validation byCluster="true" byOtherPop="true" byHapMap="true" 
    by1000G="true"> 
     <otherPopBatchId>7179</otherPopBatchId> 
    </Validation> 
    <Create build="36" date="2000-09-19 17:02"/> 
    <Update build="144" date="2015-05-07 10:52"/> 
    <Sequence exemplarSs="491581208" ancestralAllele="C,C"> 
    <Seq5> 
    ATAAGCAAATAACTGAAGTTTAATCAGTCTCCTCCCAGCAAGTGATATGCAACTGAGATTCC 
    TTATGACACATCTGAACACTAGTGGATTTGCTTTGTAGTAGGAACAA 
    GGTACATTCGCGGGATAAATGTGGCCAAGTTTTATCTGCTGCCAGGGCTTTCAAAT 
    AGGTTGACCTGACAATGGGTCACCTCTGGGACTGA</Seq5> 
     <Observed>C/T</Observed> 
    <Seq3>AATTAGGAAGAGCTGGTACCTAAAATGAAAGATGCCCTTAAATTTCAGATTCACAATTTTTT 
     TTTCTTAGTATAAGCATGTCCCATGTAATATCTGGGATATACTCATACCTT 
     TAAAAATGTGCTCATTGTTTATCTGAAATTCACATTTTAACAGGGAACCATTGT 
     TTTGTTATTGTTTATTGTTTTGTTTCTAAATAA</Seq3> 
    </Sequence> 
    <Ss ssId="1556770886" handle="1000GENOMES" batchId="1061891" 
    locSnpId="PHASE3_chrY_229259" subSnpClass="snp" orient="reverse" 
     strand="top" molType="genomic" buildId="144" 
     methodClass="sequence" validated="by-submitter"> 
     <Sequence> 
      <Seq5>TTTTAGGTACCAGCTCTTCCTAATT</Seq5> 
      <Observed>A/G</Observed> 
      <Seq3>TCAGTCCCAGAGGTGACCCATTGTC</Seq3> 
     </Sequence> 
    </Ss> 
    <Assembly dbSnpBuild="144" genomeBuild="38.2" 
    groupLabel="GRCh38.p2" current="true" reference="true"> 
     <Component componentType="contig" accession="NT_011875.13" 
     chromosome="Y" start="11642902" end="21789280" 
     orientation="fwd" gi="568801947" groupTerm="NC_000024.10" 
     contigLabel="GCF_000001405.28"> 
      <MapLoc asnFrom="5341580" asnTo="5341580" locType="exact" 
     alnQuality="1" orient="reverse" physMapInt="16984482" 
     leftContigNeighborPos="5341579"rightContigNeighborPos="5341581" 
     refAllele="G"/> 
     </Component> 
     <SnpStat mapWeight="unique-in-contig" chromCount="1" 
     placedContigCount="1" unplacedContigCount="0" seqlocCount="1" 
     hapCount="0"/> 
    </Assembly> 
    <RsLinkout resourceId="1" linkValue="3894"/> 
    <RsLinkout resourceId="4" linkValue="60936"/> 
    <RsLinkout resourceId="5" linkValue="23388839"/> 
    <MergeHistory rsId="56546490" buildId="130"/> 
    <MergeHistory rsId="386588736" buildId="142"/> 
    <hgvs>NC_000024.9:g.19096363G&gt;A</hgvs> 
    <hgvs>NC_000024.10:g.16984483G&gt;A</hgvs> 
    <Frequency freq="0.0276" allele="A" sampleSize="1233"/> 
</Rs> 
+0

給我們一些有效的XML,以及如何映射到所需輸出一個更好的主意,我們可以幫助 – Sobrique

+0

@Sobrique,謝謝,我現在修改了我的代碼。這是我的長代碼的一部分,我不能發佈它,因爲它有點長。另外,我的XML文件也很大,爲此我只添加了一部分。 –

+0

這仍然是無效的XML。子集是可以的,但它必須是有效的。 – Sobrique

回答

-1

twig_handlers適用於預處理XML,尤其是在您丟棄時。

它可能不是你雖然想在這裏的東西 - 它看起來就像你正在試圖做的是:

  • 提取每個「MergeHistory」元素從每個「盧比」元素。
  • 打印重新格式化的內容。

因此,考慮到這一點 - 我想你可能想要的是findnodeschildren

my $twig = XML::Twig->parsefile($file); 

foreach my $rs ($twig->findnodes('//Rs')) { 
    print join(",", 
     map { "rs" . $_->att('rsId') } $rs->children('MergeHistory')), 
     "\t"; 
    print join(",", 
     map { "b" . $_->att('buildId') } $rs->children('MergeHistory')), 
     "\n"; 
} 

鑑於你的樣品,這種打印:

rs56546490,rs386588736 b130,b142 

它看起來大概你想要的嗎?

  • 我們使用findnodes來迭代Rs元素。
  • 在每個中,我們使用children來獲取MergeHistory元素。
  • map提取屬性並將前面的brs字符串連接。
  • join以逗號分隔進行合併。

(你仍然可以做上面twig_handlers如果你願意,通過射擊「RS」的處理程序代替)

+0

謝謝,它現在工作正常 –