2

我有以下 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;
4

2 回答 2

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.


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

于 2012-12-12T21:56:12.053 回答
0

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

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

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

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

于 2014-12-18T11:28:01.420 回答