2012-12-12 33 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?