Suite à certains didacticiels existants, j'ai créé un script Perl ci-dessous pour générer du code XML à partir de xsd.XML :: Compiler pour générer un exemple de code XML à partir d'un schéma avec énumération et choix
Script:
#!/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);
schéma d'entrée:
<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>
La sortie est correcte. Pour aller plus loin, dans l'exemple de schéma, il y a des éléments de choix, des énumérations et des éléments répétitifs. Je voudrais:
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.
Les fichiers XML de sortie montant est: i * j (i: la quantité de choix dans chaque nœud récursive, peut être i1 * i2 * i3 ... j: la quantité de énumérations dans chaque nœud récursivement, peut être j1 * j2 * j3 ...)
Dans ce cas, il génère 2 * 3 = 6 fichiers XML (s'il y a un nœud incorporé avec 2 valeurs d'énumération, alors il devient 2 * 2 * 3 = 12 fichiers XML), similaires à:
fichier 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>
fichier 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>
fichier 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>
fichier 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>
fichier 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>
fichier 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>
je tout d'abord bloqué pour obtenir la valeur correcte pour i et j, car ils seront variables utilisées dans les noms de fichiers XML générés, puis le possible Divisé. Toute aide est appréciée!
Êtes-vous en train de construire un test unitaire de toutes les paires pour votre schéma? – simbabque
Oui, c'est en quelque sorte l'idée – dellair
Je lui ai donné une seconde cependant, peut-être modifier le module XML :: Compile, pour donner une valeur/étiquette spéciale à l'énumération et au choix, puis diviser le XML généré. Par exemple: AAENUMERATION1 BBENUMERATION2 2017-10-2CHOICE1 exampleCHOICE2 exampleCHOICE3 –
dellair