2014-01-30 5 views
2

Работая над этим в течение нескольких часов в настоящее время, и даже с this учебником, размещенного saberworks в другом таком же вопросе, я не заставить его работать ...Perl преобразование XSD в XML

Итак, я пытаюсь конвертировать .xsd файлов в xml structures, которые могут быть доступны и завершены после libXML или любым другим xml-parser.

Если вы посмотрите на связанный учебник, можно ли легко автоматизировать второй шаг, когда saberworks создает конечную структуру данных вручную?

Как я понял, он просто использует вывод, чтобы получить «ключ», какой-то путеводитель, как должен выглядеть xml. Но возможно ли создать целую структуру perl, которая может быть использована (проанализирована) на libXML?

И если у нас уже есть структура xml, как работает XML::Compile/XML::LibXML с дополнительными элементами? Если я не помещаю никаких значений или элементов в необязательный элемент, будет ли он отображаться в окончательном выводе xml? В случае, если это так, есть ли способ предотвратить это?

use warnings; 
use strict; 
use Data::Dumper; 
use XML::Compile::Schema; 
use XML::LibXML; 

my $xsd = 'schema.xsd'; 
my $schema = XML::Compile::Schema->new($xsd); 
my $xml_temp = $schema -> template('PERL', 'addresses'); 

# ***convert $xml_temp to "real" perl hash structure*** 

my $doc = XML::LibXML::Document->new('1.0', 'UTF-8'); 
my $write = $schema -> compile(WRITER => 'addresses'); 
my $xml = $write -> ($doc, $xml_temp); 
$doc -> setDocumentElement($xml); 
print $doc -> toString(1); 
+0

Вы протестировали его? – simbabque

+0

конечно, но я не могу найти способ преобразования шаблона perl в perl datastructure, который может использоваться libXML – Jonas93

+0

Пожалуйста, отредактируйте свой вопрос и покажите, что вы пробовали до сих пор, поэтому мы можем работать над этим. – simbabque

ответ

0

Обычно вы хотите динамически генерироваться данные, которые будут переданы в XML писатель. Чтобы помочь вам создать правильную структуру данных, метод template() дает вам строковое представление такой структуры данных наряду с некоторыми полезными комментариями. Если вы хотите увидеть минимальный образец, вы можете превратить строку в фактическую структуру данных Perl с eval.

Для простоты я включил образец схемы из the tutorial в адаптированный сценарий образца.

Что касается вашего второго вопроса, я бы предположил, что необязательные элементы не помещаются в XML, если у вас их нет на вашем входе.

use strict; 
use warnings; 

use Data::Dumper; 
use XML::Compile::Schema; 
use XML::LibXML; 

my $schema = XML::Compile::Schema->new(q{<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'> 
    <xs:element name="addresses"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="address" minOccurs='1' maxOccurs='unbounded'/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="address"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="name" minOccurs='0' maxOccurs='1'/> 
     <xs:element ref="street" minOccurs='0' maxOccurs='1'/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="name" type='xs:string'/> 
    <xs:element name="street" type='xs:string'/> 
</xs:schema> 
}); 

# this returns a string representation of a sample Perl datastructure 
my $template = $schema->template('PERL', 'addresses'); 
print "The template:\n $template\n\n"; 

# turn the string representation into an actual Perl data structure 
my $sample; 
eval "\$sample = $template;"; 
print "The template turned into a Perl data structure:\n"; 
print Dumper($sample); 
print "\n\n"; 

# create XML from the sample Perl data structure 
my $doc = XML::LibXML::Document->new('1.0', 'UTF-8'); 
my $write = $schema->compile(WRITER => 'addresses'); 
my $xml = $write->($doc, $sample); 
$doc->setDocumentElement($xml); 
print "The generated XML:\n"; 
print $doc->toString(1); 
print "\n\n"; 
Смежные вопросы