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のサイズ(ハッシュの数は?)がわからない場合はどうなりますか?任意のサイズに拡大/縮小できます。

それらを配列に収集するとします:ユーザー入力に従って@decriptionと@names。

上記の2つの配列からのランタイム値を使用して$tissueSiteを作成することは可能ですか?

于 2014-12-18T11:28:01.420 に答える