Я изучаю, как использовать Perl в качестве инструмента инфраструктуры тестирования для веб-службы Java, и столкнулся с проблемой генерации XML-запросов из сгенерированных Pastor модулей. Проблема заключается в том, что при включении типа, который расширяется от требуемого типа для элемента, xsi: type не включается в сгенерированную строку xml. Например, я хочу сгенерировать следующий xml-запрос из модулей, сгенерированных XML :: Pastor из моего xsd:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PromptAnswersRequest xmlns="http://mycompany.com/api">
<Uri>/some/url</Uri>
<User ref="1"/>
<PromptAnswers>
<PromptAnswer xsi:type="textPromptAnswer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Prompt ref="2"/>
<Children>
<PromptAnswer xsi:type="choicePromptAnswer">
<Prompt ref="1"/>
<Choice ref="2"/>
</PromptAnswer>
</Children>
<Value>totally</Value>
</PromptAnswer>
</PromptAnswers>
</PromptAnswersRequest>
То, что я сейчас получаю, это:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PromptAnswersRequest xmlns="http://mycompany.com/api">
<Uri>/some/url</Uri>
<User ref="1"/>
<PromptAnswers>
<PromptAnswer>
<Prompt ref="2"/>
<Children>
<PromptAnswer>
<Prompt ref="1"/>
<Choice ref="2"/>
</PromptAnswer>
</Children>
<Value>totally</Value>
</PromptAnswer>
</PromptAnswers>
</PromptAnswersRequest>
Вот некоторые соответствующие фрагменты из xsd:
<xs:complexType name="request">
<xs:sequence>
<xs:element name="Uri" type="xs:anyURI"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="promptAnswersRequest">
<xs:complexContent>
<xs:extension base="api:request">
<xs:sequence>
<xs:element name="User" type="api:ref"/>
<xs:element name="PromptAnswers" type="api:promptAnswerList"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="promptAnswerList">
<xs:sequence>
<xs:element name="PromptAnswer" type="api:promptAnswer" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="promptAnswer" abstract="true">
<xs:sequence>
<xs:element name="Prompt" type="api:ref"/>
<xs:element name="Children" type="api:promptAnswerList" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="textPromptAnswer">
<xs:complexContent>
<xs:extension base="promptAnswer">
<xs:sequence>
<xs:element name="Value" type="api:nonEmptyString" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
А вот соответствующие части сценария:
my $promptAnswerList = new My::API::Type::promptAnswerList;
my @promptAnswers;
my $promptAnswerList2 = new My::API::Type::promptAnswerList;
my @textPromptAnswerChildren;
my $textPromptAnswer = new My::API::Type::textPromptAnswer;
my $textPromptAnswerRef = new My::API::Type::ref;
$textPromptAnswerRef->ref('2');
$textPromptAnswer->Prompt($textPromptAnswerRef);
my $choicePromptAnswer = new My::API::Type::choicePromptAnswer;
my $choicePromptAnswerPromptRef = new My::API::Type::ref;
my $choicePromptAnswerChoiceRef = new My::API::Type::ref;
$choicePromptAnswerPromptRef->ref('1');
$choicePromptAnswerChoiceRef->ref('2');
$choicePromptAnswer->Prompt($choicePromptAnswerPromptRef);
$choicePromptAnswer->Choice($choicePromptAnswerChoiceRef);
push(@textPromptAnswerChildren, $choicePromptAnswer);
$promptAnswerList2->PromptAnswer(@textPromptAnswerChildren);
$textPromptAnswer->Children($promptAnswerList2);
$textPromptAnswer->Value('totally');
push(@promptAnswers, $textPromptAnswer);
Я не видел нигде в документации по модулям XML :: Pastor этого адреса, поэтому, если кто-нибудь может подсказать мне хорошую ссылку для его использования, это будет с благодарностью. Кроме того, я использую только XML :: Pastor, потому что я не знаю других модулей, которые могут это сделать, поэтому, если кто-то из вас знает что-то более простое в использовании или в более хорошем состоянии, пожалуйста, дайте мне знать об этом. тоже!