在一些现有的教程之后,我创建了下面的perl脚本来从xsd生成
XML.
脚本:
#!/opt/perl/bin/perl -w use warnings; use strict; use XML::Compile::Schema; use XML::LibXML::Reader; use XML::Compile::Util qw/pack_type/; my $in_qfn = $ARGV[0]; my $out_qfn = $ARGV[1]; open (OUT,">$out_qfn") || die "Unable to create output file: $out_qfn\n"; # Generate the hash of xml my $schema = XML::Compile::Schema->new($in_qfn); my $type = pack_type 'urn:testsample','Document'; my $data = $schema->template('PERL',$type); $data =~ s/#.*//g; $data =~ s/\s*//g; $data = eval($data); # Print the xml my $doc = XML::LibXML::Document->new('1.0','UTF-8'); my $write = $schema->compile(WRITER=>$type); my $xml = $write->($doc,$data); $doc->setDocumentElement($xml); print OUT $doc->toString(1);
输入架构:
<xs:schema xmlns="urn:testsample" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:testsample" elementFormDefault="qualified"> <xs:element name="Document"> <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 name="Pname" type="Pname" minOccurs="0" maxOccurs="1"/> <xs:element ref="street" minOccurs="0" maxOccurs="3"/> <xs:element name="contact" type="contacttype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="contacttype"> <xs:choice> <xs:element ref="bday" minOccurs="0" maxOccurs="1"/> <xs:element ref="email" minOccurs="0" maxOccurs="1"/> <xs:element ref="postal" minOccurs="0" maxOccurs="2"/> </xs:choice> </xs:complexType> <xs:simpleType name="Pname"> <xs:restriction base="xs:string"> <xs:enumeration value="AA"/> <xs:enumeration value="BB"/> </xs:restriction> </xs:simpleType> <xs:element name="street" type="xs:string"/> <xs:element name="email" type="xs:string"/> <xs:element name="postal" type="xs:string"/> <xs:element name="bday" type="xs:date"/> </xs:schema>
输出是正确的.更进一步,在示例模式中,有选择元素,枚举和重复元素.我想要:
1. iterate all the possible values 2. generate maximum repetitive elements,if unbounded then 99 3. generate all choice values 4. split them into multiple XML files such that every XML is valid against the original schema.
输出XML文件的数量是:i * j(i:递归地在每个节点中的选择量,可以是i1 * i2 * i3 … j:递归地每个节点中的枚举量,可以是j1 * j2 * j3 …)
在这种情况下,它输出2 * 3 = 6个XML文件(如果有一个嵌入节点有2个枚举值,则它变为2 * 2 * 3 = 12个XML文件),类似于:
XML文件1:
<x0:Document xmlns:x0="urn:testsample"> <x0:address> <x0:Pname>AA</x0:Pname> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:contact> <x0:email>example</x0:email> </x0:contact> </x0:address> </x0:Document>
XML文件2:
<x0:Document xmlns:x0="urn:testsample"> <x0:address> <x0:Pname>BB</x0:Pname> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:contact> <x0:email>example</x0:email> </x0:contact> </x0:address> </x0:Document>
XML文件3:
<x0:Document xmlns:x0="urn:testsample"> <x0:address> <x0:Pname>AA</x0:Pname> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:contact> <x0:bday>2017-10-2</x0:bday> </x0:contact> </x0:address> </x0:Document>
XML文件4:
<x0:Document xmlns:x0="urn:testsample"> <x0:address> <x0:Pname>BB</x0:Pname> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:contact> <x0:bday>2017-10-2</x0:bday> </x0:contact> </x0:address> </x0:Document>
XML文件5:
<x0:Document xmlns:x0="urn:testsample"> <x0:address> <x0:Pname>AA</x0:Pname> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:contact> <x0:postal>example</x0:postal> <x0:postal>example</x0:postal> </x0:contact> </x0:address> </x0:Document>
XML文件6:
<x0:Document xmlns:x0="urn:testsample"> <x0:address> <x0:Pname>BB</x0:Pname> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:street>example</x0:street> <x0:contact> <x0:postal>example</x0:postal> <x0:postal>example</x0:postal> </x0:contact> </x0:address> </x0:Document>