Perl生成动态XML文件

时间:2012-12-12 13:18:56

标签: xml perl

我有以下要创建的XML,并通过Perl脚本填充数据。在这个XML中,我有一些集合类型的属性,即primarySiteCollection。

如何动态填充和生成'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;

2 个答案:

答案 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添加更多哈希值。


请记住,如果它变得更复杂,另一种方法更适合。

答案 1 :(得分:0)

我按照上面的方法,工作正常。

但是如果我不知道$ tissueSite的大小(它将具有的哈希数量?)该怎么办?它可以扩展/缩小到任何大小。

假设我在数组中收集它们:@decription和@names根据用户输入。

是否可以使用上述两个数组的运行时值创建$ tissueSite?