2012-12-12 37 views
2

我有下面的XML,我想通過Perl腳本創建並填充數據。在這個XML中,我有一些集合類型的屬性,例如primarySiteCollection。Perl生成動態XML文件

如何動態填充並生成'primarySiteCollection'節點。 在這個XML中,primarySiteCollection包含3個組織站點,但可以有1個或多個。

<TumorDetails> 
    <personUpi>String</personUpi> 
    <ageAtDiagnosis>3.14159E0</ageAtDiagnosis> 
    <biopsyPathologyReportSummary>String</biopsyPathologyReportSummary> 
    <primarySiteCollection> 
     <tissueSite> 
      <description>String1</description> 
      <name>String1</name> 
     </tissueSite> 
     <tissueSite> 
      <description>String2</description> 
      <name>String2</name> 
     </tissueSite> 
     <tissueSite> 
      <description>String3</description> 
      <name>String3</name> 
     </tissueSite>  
    </primarySiteCollection> 
</TumorDetails> 

這是我的Perl腳本。 我想生成包含屬性集合類型的動態節點。

use strict; 
use warnings; 
use XML::Compile::Schema; 

my $node = { 
    personUpi     => 'String', 
    ageAtDiagnosis    => '3.14159E0', 
    biopsyPathologyReportSummary => 'String', 
    primarySiteCollection  => { 
     tissueSite => { 
      description => 'String', 
      name  => 'String', 
     }, 
    }, 
}; 

my $schema = XML::Compile::Schema->new('sample.xsd'); 
my $writer = $schema->compile(WRITER => 'TumorDetails'); 
my $doc = XML::LibXML::Document->new(q(1.0), q(UTF-8)); 

print $writer->($doc, $node)->toString; 
+0

這並不完全清楚你想要做什麼。你想使用perl腳本將數據添加到此?如果是這樣,你能告訴我們的Perl腳本?否則,這會成爲'爲我做我的工作'的問題,這個問題通常並不受歡迎。 –

+0

絕對沒有打算如你所說的! –

+0

你能澄清你的問題嗎? –

回答

2

我覺得這很簡單,可以用XML::Simple安全地做到這一點。如果它更加複雜,並且您必須處理從對象派生的複雜數據類型,那麼架構將非常有用。但爲此,XML :: Simple將做到這一點。

#!/usr/bin/perl 
use strict; 
use warnings; 

use XML::Simple; 

my $tissueSite = [ 
    { 
    description => 'String', 
    name  => 'String', 
    }, 
    { 
    description => 'String2', 
    name  => 'String2', 
    }, 
]; 

my $data = { 
    tumorDetails => { 
    personUpi => 'String', 
    ageAtDiagnosis => '3.14159E0', 
    biopsyPathologyReportSummary => 'String', 
    primarySiteCollection => { 
     tissueSite => $tissueSite, 
    }, 
    }, 
}; 

print XMLout($data, KeepRoot => 1, noAttr => 1); 

您可以添加更多散列到$tissueSite


請記住,如果它變得複雜得多,另一種方法更適合。

+0

在另一個說明中,這個數據結構中的鍵是病態的。 BRR。 – simbabque

+0

謝謝!這是我期待的。 –

0

我遵循上面的方法,工作正常。

但是,如果我不知道$ tissueSite的大小(它將具有的哈希數)呢?它可以擴展/縮小到任何尺寸。

假設我收集他們在數組中:@decription和@names根據用戶輸入。

是否有可能使用兩個數組之上的運行時值創建$ tissueSite?