【发布时间】:2018-03-13 09:34:36
【问题描述】:
按照一些现有的教程,我在 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>
我首先坚持为 i 和 j 获取正确的值,因为它们将是生成的 XML 文件名中使用的变量,然后是可能的拆分。任何帮助表示赞赏!
【问题讨论】:
-
您是否正在尝试为您的架构构建一个全对单元测试?
-
是的,就是这样
-
我给了它一秒钟,也许修改 XML::Compile 模块,给枚举和选择一些特殊的值/标签,然后拆分生成的 XML。例如:
AAENUMERATION1 BBENUMERATION2 2017-10-2CHOICE1 exampleCHOICE2 exampleCHOICE3