2

作成してPerlスクリプトを入力したい次のXMLファイルテンプレートがあります。XML属性のすべての値は、さまざまなクエリによってSQLデータベースから取得されます。私のXMLには、コレクションタイプの属性がほとんど含まれていません。

CPANには多くの選択肢があるため、どのperlモジュールを使用すべきかが難しいと感じています。また、この問題にどのように取り組むべきか知りたいです。

どんな助けでも大歓迎です。

`

<TumorDetails>
    <personUpi>String</personUpi>
    <ageAtDiagnosis>3.14159E0</ageAtDiagnosis>
    <biopsyPathologyReportSummary>String</biopsyPathologyReportSummary>
    <primarySiteCollection>
        <tissueSite>
            <description>String</description>
            <name>String</name>
        </tissueSite>
    </primarySiteCollection>
    <distantMetastasisSite>
        <description>String</description>
        <name>String</name>
    </distantMetastasisSite>
    <siteGroup>
        <description>String</description>
        <name>String</name>
    </siteGroup>
    <tmStaging>
        <clinicalDescriptor>String</clinicalDescriptor>
        <clinicalMStage>String</clinicalMStage>
        <siteGroupEdition5>
            <description>String</description>
            <name>String</name>
        </siteGroupEdition5>
        <siteGroupEdition6>
            <description>String</description>
            <name>String</name>
        </siteGroupEdition6>
    </tmStaging>
    <pediatricStaging>
        <doneBy>String</doneBy>
        <group>String</group>
    </pediatricStaging>
    <histologicTypeCollection>
        <histologicType>
            <description>String</description>
            <system>String</system>
            <value>String</value>
        </histologicType>
    </histologicTypeCollection>
    <histologicGradeCollection>
        <histologicGrade>
            <gradeOrDifferentiation>String</gradeOrDifferentiation>
        </histologicGrade>
    </histologicGradeCollection>
    <familyHistoryCollection>
        <familyHistory>
            <otherCancerDiagnosed>String</otherCancerDiagnosed>
            <sameCancerDiagnosed>String</sameCancerDiagnosed>
        </familyHistory>
    </familyHistoryCollection>
    <comorbidityOrComplicationCollection>
        <comorbidityOrComplication>
            <value>String</value>
        </comorbidityOrComplication>
    </comorbidityOrComplicationCollection>
    <tumorBiomarkerTest>
        <her2NeuDerived>String</her2NeuDerived>
        <her2NeuFish>String</her2NeuFish>
    </tumorBiomarkerTest>
    <patientHistoryCollection>
        <patientHistory>
            <cancerSite>String</cancerSite>
            <sequence>2147483647</sequence>
        </patientHistory>
    </patientHistoryCollection>
    <tumorHistory>
        <cancerStatus>String</cancerStatus>
        <cancerStatusFollowUpDate>1967-08-13</cancerStatusFollowUpDate>
        <cancerStatusFollowUpType>String</cancerStatusFollowUpType>
        <qualityOfSurvival>String</qualityOfSurvival>
    </tumorHistory>
    <placeOfDiagnosis>
        <initials>String</initials>
    </placeOfDiagnosis>
    <followUp>
        <dateFollowUpChanged>String</dateFollowUpChanged>
        <dateOfLastCancerStatus>1967-08-13</dateOfLastCancerStatus>
        <nextFollowUpHospital>
            <initials>String</initials>
        </nextFollowUpHospital>
        <lastFollowUpHospital>
            <initials>String</initials>
        </lastFollowUpHospital>
        <tumorFollowUpBiomarkerTest>
            <her2NeuDerived>String</her2NeuDerived>
            <her2NeuFish>String</her2NeuFish>
        </tumorFollowUpBiomarkerTest>
    </followUp>
</TumorDetails>

`

4

4 に答える 4

3

まず、非常に重要な概念です。「XMLテンプレート」のようなものはありません。XMLを使用することの全体的なポイントは、いくつかのスキーマに従ってデータを読み書きできることです。(一貫性のある)XMLサンプルがあり、スキーマ定義(XSD)がない場合は、trangを使用してそれを把握します。

java -jar trang.jar sample.xml sample.xsd

提供されているサンプルの場合、生成されたXSDファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="TumorDetails">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="personUpi"/>
        <xs:element ref="ageAtDiagnosis"/>
        <xs:element ref="biopsyPathologyReportSummary"/>
        <xs:element ref="primarySiteCollection"/>
        <xs:element ref="distantMetastasisSite"/>
        <xs:element ref="siteGroup"/>
        <xs:element ref="tmStaging"/>
        <xs:element ref="pediatricStaging"/>
        <xs:element ref="histologicTypeCollection"/>
        <xs:element ref="histologicGradeCollection"/>
        <xs:element ref="familyHistoryCollection"/>
        <xs:element ref="comorbidityOrComplicationCollection"/>
        <xs:element ref="tumorBiomarkerTest"/>
        <xs:element ref="patientHistoryCollection"/>
        <xs:element ref="tumorHistory"/>
        <xs:element ref="placeOfDiagnosis"/>
        <xs:element ref="followUp"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
...
</xs:schema>

そして今、XML::Compileと呼ばれる最良の部分。XSDスキーマを取得してコンパイルし、ネイティブのPerl構造に適合/検証して、出力としてXMLを生成します。

#!/usr/bin/env 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;
于 2012-11-28T00:50:34.160 に答える
2

多くはあなたがすでに精通していることに依存します。Document Object Modelを使用してXMLドキュメントをナビゲートすることに慣れている場合はXML::DOMXML::LibXMLまたはそれXML::Twigが優れている一方XML::TreeBuilderで、独自のAPIを備えた同様のモジュールであり、試してみるだけで自分に合っているかどうかがわかります。

ただし、これらのモジュールはすべて、既存のXMLデータをナビゲートしてアクセスすることを目的としており、新しいXMLを最初から作成する場合に部分的にしか役立ちません。代わりに、モジュール XML::GeneratorXML::Writerおよび XML::API はこの目的のために特別に設計されており、すべて同様のインターフェイスを備えています。私の好み、そしてあなたへの私の推薦XML::APIは、最も柔軟なインターフェースを持ち、あなたの目的によく合うはずです。

を使用XML::APIすると、特定のXMLドキュメントを生成するコードは、結果のXMLと1対1で対応します。各ステートメントは単一のXML要素またはタグに対応し、タグと属性の名前およびテキスト値は、たとえばデータベースからの情報を使用して、実行時に導出できます。

このプログラムは、サンプルXMLを再作成します。サブセクションは個別にコーディングしてサブルーチンに分割し、XML::APIそれぞれにオブジェクトを渡すことができることに注意してください。各メソッドが要素への参照を返すため、非線形の方法でXMLを生成することも可能です_goto。また、そのような参照を取得して後続の追加の場所を設定するメソッドがあります。実際、この_closeメソッドは、データを書き込むのではなく_goto、現在の要素の親に対してを実行するだけです。

use strict;
use warnings;

use XML::API;

my $xml = XML::API->new(doctype => 'xhtml');

$xml->_open('TumorDetails');

  $xml->_element('personUpi', 'String');
  $xml->_element('ageAtDiagnosis', '3.14159E0');
  $xml->_element('biopsyPathologyReportSummary', 'String');

  $xml->_open('primarySiteCollection');
    $xml->_open('tissueSite');
      $xml->_element('description', 'String');
      $xml->_element('name', 'String');
    $xml->_close('tissueSite');
  $xml->_close('primarySiteCollection');

  $xml->_open('distantMetastasisSite');
    $xml->_element('description', 'String');
    $xml->_element('name', 'String');
  $xml->_close('distantMetastasisSite');

  $xml->_open('siteGroup');
    $xml->_element('description', 'String');
    $xml->_element('name', 'String');
  $xml->_close('siteGroup');

  $xml->_open('tmStaging');
    $xml->_element('clinicalDescriptor', 'String');
    $xml->_element('clinicalMStage', 'String');
    $xml->_open('siteGroupEdition5');
      $xml->_element('description', 'String');
      $xml->_element('name', 'String');
    $xml->_close('siteGroupEdition5');
    $xml->_open('siteGroupEdition6');
      $xml->_element('description', 'String');
      $xml->_element('name', 'String');
    $xml->_close('siteGroupEdition6');
  $xml->_close('tmStaging');

  $xml->_open('pediatricStaging');
    $xml->_element('doneBy', 'String');
    $xml->_element('group', 'String');
  $xml->_close('pediatricStaging');

  $xml->_open('histologicTypeCollection');
    $xml->_open('histologicType');
      $xml->_element('description', 'String');
      $xml->_element('system', 'String');
      $xml->_element('value', 'String');
    $xml->_close('histologicType');
  $xml->_close('histologicTypeCollection');

  $xml->_open('histologicGradeCollection');
    $xml->_open('histologicGrade');
      $xml->_element('gradeOrDifferentiation', 'String');
    $xml->_close('histologicGrade');
  $xml->_close('histologicGradeCollection');

  $xml->_open('familyHistoryCollection');
    $xml->_open('familyHistory');
      $xml->_element('otherCancerDiagnosed', 'String');
      $xml->_element('sameCancerDiagnosed', 'String');
    $xml->_close('familyHistory');
  $xml->_close('familyHistoryCollection');

  $xml->_open('comorbidityOrComplicationCollection');
    $xml->_open('comorbidityOrComplication');
      $xml->_element('value', 'String');
    $xml->_close('comorbidityOrComplication');
  $xml->_close('comorbidityOrComplicationCollection');

  $xml->_open('tumorBiomarkerTest');
    $xml->_element('her2NeuDerived', 'String');
    $xml->_element('her2NeuFish', 'String');
  $xml->_close('tumorBiomarkerTest');

  $xml->_open('patientHistoryCollection');
    $xml->_open('patientHistory');
      $xml->_element('cancerSite', 'String');
      $xml->_element('sequence', '2147483647');
    $xml->_close('patientHistory');
  $xml->_close('patientHistoryCollection');

  $xml->_open('tumorHistory');
    $xml->_element('cancerStatus', 'String');
    $xml->_element('cancerStatusFollowUpDate', '1967-08-13');
    $xml->_element('cancerStatusFollowUpType', 'String');
    $xml->_element('qualityOfSurvival', 'String');
  $xml->_close('tumorHistory');

  $xml->_open('placeOfDiagnosis');
    $xml->_element('initials', 'String');
  $xml->_close('placeOfDiagnosis');

  $xml->_open('followUp');
    $xml->_element('dateFollowUpChanged', 'String');
    $xml->_element('dateOfLastCancerStatus', '1967-08-13');
    $xml->_open('nextFollowUpHospital');
      $xml->_element('initials', 'String');
    $xml->_close('nextFollowUpHospital');
    $xml->_open('lastFollowUpHospital');
      $xml->_element('initials', 'String');
    $xml->_close('lastFollowUpHospital');
    $xml->_open('tumorFollowUpBiomarkerTest');
      $xml->_element('her2NeuDerived', 'String');
      $xml->_element('her2NeuFish', 'String');
    $xml->_close('tumorFollowUpBiomarkerTest');
  $xml->_close('followUp');

$xml->_close('TumorDetails');

print $xml;
于 2012-11-27T16:22:06.067 に答える
1

データが常に同一である場合は、ddoxeyのTemplateToolkitソリューションが適していますが、一部のタグが存在しない場合は、毎回XMLを最初から作成する必要があります。

私は最近XMLでいくつかの作業を行い、非常に満足していXML::Writerます。

于 2012-11-27T16:32:20.527 に答える
0

私はテンプレートツールキットにやや偏っています。見る:

#!/usr/bin/perl -Tw

use strict;
use warnings;
use Template;

my $tmpl = get_template();
my $rec  = get_record();
my $xml;

my $template = Template->new();

$template->process( \$tmpl, $rec, \$xml )
    || die $template->error();

print "$xml";

# ...

sub get_record {

    return {
        personUpi                    => 'String',
        ageAtDiagnosis               => '3.14159E0',
        biopsyPathologyReportSummary => 'String',
        primarySiteCollection        => {
            tissueSite => {
                description => 'String',
                name        => 'String',
            },
        },
        distantMetastasisSite => {
            description => 'String',
            name        => 'String',
        },
        siteGroup => {
            description => 'String',
            name        => 'String',
        },
        tmStaging => {
            clinicalDescriptor => 'String',
            clinicalMStage     => 'String',
            siteGroupEdition5  => {
                description => 'String',
                name        => 'String',
            },
            siteGroupEdition6 => {
                description => 'String',
                name        => 'String',
            },
        },
        pediatricStaging => {
            doneBy => 'String',
            group  => 'String',
        },
        histologicTypeCollection => {
            histologicType => {
                description => 'String',
                system      => 'String',
                value       => 'String',
            },
        },
        histologicGradeCollection => {
            histologicGrade => { gradeOrDifferentiation => 'String', }, },
        familyHistoryCollection => {
            familyHistory => {
                otherCancerDiagnosed => 'String',
                sameCancerDiagnosed  => 'String',
            },
        },
        comorbidityOrComplicationCollection => {
            comorbidityOrComplicationCollection => { value => 'String', },
        },
        tumorBiomarkerTest => {
            her2NeuDerived => 'String',
            her2NeuFish    => 'String',
        },
        patientHistoryCollection => {
            patientHistory => {
                cancerSite => 'String',
                sequence   => '2147483647',
            },
        },
        tumorHistory => {
            cancerStatus             => 'String',
            cancerStatusFollowUpDate => '1967-08-13',
            cancerStatusFollowUpType => 'String',
            qualityOfSurvival        => 'String',
        },
        placeOfDiagnosis => { initials => 'String', },
        followUp         => {
            dateFollowUpChanged        => 'String',
            dateOfLastCancerStatus     => '1967-08-13',
            nextFollowUpHospital       => { initials => 'String', },
            lastFollowUpHospital       => { initials => 'String', },
            tumorFollowUpBiomarkerTest => {
                her2NeuDerived => 'String',
                her2NeuFish    => 'String',
            },
        },
    };
}

sub get_template {

    return <<'END_TEMPL';
<TumorDetails>
    <personUpi>[% personUpi %]</personUpi>
    <ageAtDiagnosis>[% ageAtDiagnosis %]</ageAtDiagnosis>
    <biopsyPathologyReportSummary>[% biopsyPathologyReportSummary %]</biopsyPathologyReportSummary>
    <primarySiteCollection>
        <tissueSite>
            <description>[% primarySiteCollection.tissueSite.description %]</description>
            <name>[% primarySiteCollection.tissueSite.name %]</name>
        </tissueSite>
    </primarySiteCollection>
    <distantMetastasisSite>
        <description>[% distantMetastasisSite.description %]</description>
        <name>[% distantMetastasisSite.name %]</name>
    </distantMetastasisSite>
    <siteGroup>
        <description>[% siteGroup.description %]</description>
        <name>[% siteGroup.name %]</name>
    </siteGroup>
    <tmStaging>
        <clinicalDescriptor>[% tmStaging.clinicalDescriptor %]</clinicalDescriptor>
        <clinicalMStage>[% tmStaging.clinicalMStage %]</clinicalMStage>
        <siteGroupEdition5>
            <description>[% tmStaging.siteGroupEdition5.description %]</description>
            <name>[% tmStaging.siteGroupEdition5.name %]</name>
        </siteGroupEdition5>
        <siteGroupEdition6>
            <description>[% tmStaging.siteGroupEdition6.description %]</description>
            <name>[% tmStaging.siteGroupEdition6.name %]</name>
        </siteGroupEdition6>
    </tmStaging>
    <pediatricStaging>
        <doneBy>[% pediatricStaging.doneBy %]</doneBy>
        <group>[% pediatricStaging.group %]</group>
    </pediatricStaging>
    <histologicTypeCollection>
        <histologicType>
            <description>[% histologicTypeCollection.histologicType.description %]</description>
            <system>[% histologicTypeCollection.histologicType.system %]</system>
            <value>[% histologicTypeCollection.histologicType.value %]</value>
        </histologicType>
    </histologicTypeCollection>
    <histologicGradeCollection>
        <histologicGrade>
            <gradeOrDifferentiation>[% histologicGradeCollection.histologicGrade.gradeOrDifferentiation %]</gradeOrDifferentiation>
        </histologicGrade>
    </histologicGradeCollection>
    <familyHistoryCollection>
        <familyHistory>
            <otherCancerDiagnosed>[% familyHistoryCollection.familyHistory.otherCancerDiagnosed %]</otherCancerDiagnosed>
            <sameCancerDiagnosed>[% familyHistoryCollection.familyHistory.sameCancerDiagnosed %]</sameCancerDiagnosed>
        </familyHistory>
    </familyHistoryCollection>
    <comorbidityOrComplicationCollection>
        <comorbidityOrComplication>
            <value>[% comorbidityOrComplicationCollection.comorbidityOrComplicationCollection.value %]</value>
        </comorbidityOrComplication>
    </comorbidityOrComplicationCollection>
    <tumorBiomarkerTest>
        <her2NeuDerived>[% tumorBiomarkerTest.her2NeuDerived %]</her2NeuDerived>
        <her2NeuFish>[% tumorBiomarkerTest.her2NeuFish %]</her2NeuFish>
    </tumorBiomarkerTest>
    <patientHistoryCollection>
        <patientHistory>
            <cancerSite>[% patientHistoryCollection.patientHistory.cancerSite %]</cancerSite>
            <sequence>[% patientHistoryCollection.patientHistory.sequence %]</sequence>
        </patientHistory>
    </patientHistoryCollection>
    <tumorHistory>
        <cancerStatus>[% tumorHistory.cancerStatus %]</cancerStatus>
        <cancerStatusFollowUpDate>[% tumorHistory.cancerStatusFollowUpDate %]</cancerStatusFollowUpDate>
        <cancerStatusFollowUpType>[% tumorHistory.cancerStatusFollowUpType %]</cancerStatusFollowUpType>
        <qualityOfSurvival>[% tumorHistory.qualityOfSurvival %]</qualityOfSurvival>
    </tumorHistory>
    <placeOfDiagnosis>
        <initials>[% placeOfDiagnosis.initials %]</initials>
    </placeOfDiagnosis>
    <followUp>
        <dateFollowUpChanged>[% followUp.dateFollowUpChanged %]</dateFollowUpChanged>
        <dateOfLastCancerStatus>[% followUp.dateOfLastCancerStatus %]</dateOfLastCancerStatus>
        <nextFollowUpHospital>
            <initials>[% followUp.nextFollowUpHospital.initials %]</initials>
        </nextFollowUpHospital>
        <lastFollowUpHospital>
            <initials>[% followUp.nextFollowUpHospital.initials %]</initials>
        </lastFollowUpHospital>
        <tumorFollowUpBiomarkerTest>
            <her2NeuDerived>[% followUp.tumorFollowUpBiomarkerTest.her2NeuDerived %]</her2NeuDerived>
            <her2NeuFish>[% followUp.tumorFollowUpBiomarkerTest.her2NeuFish %]</her2NeuFish>
        </tumorFollowUpBiomarkerTest>
    </followUp>
</TumorDetails>
END_TEMPL
}

__END__
于 2012-11-27T15:04:13.483 に答える