Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl将xsd转换为xml_Xml_Perl_Xsd_Libxml2 - Fatal编程技术网

perl将xsd转换为xml

perl将xsd转换为xml,xml,perl,xsd,libxml2,Xml,Perl,Xsd,Libxml2,我花了几个小时来研究这个问题,即使有saberworks在另一个类似问题中发布的教程,我也无法让它发挥作用 因此,我试图将.xsd文件转换为xml结构,之后可以通过libXML或任何其他xml解析器访问并完成 如果您阅读链接教程,是否可以轻松地自动化第二步,即saberworks手动创建最终数据结构 我的理解是,他只是使用输出来获得“线索”,某种指导,xml应该是什么样子。但是有没有可能生成一个完整的perl结构,供libXML使用(解析) 如果我们已经有了xml结构,xml::Compile/

我花了几个小时来研究这个问题,即使有saberworks在另一个类似问题中发布的教程,我也无法让它发挥作用

因此,我试图将
.xsd
文件转换为
xml结构
,之后可以通过
libXML
或任何其他
xml解析器
访问并完成

如果您阅读链接教程,是否可以轻松地自动化第二步,即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);

通常,您希望动态生成将要传递的数据 到XML编写器。为了帮助您生成正确的数据结构,template()方法提供了此类数据结构的字符串表示形式以及一些有用的注释。如果希望看到最小的示例,可以使用eval将字符串转换为实际的Perl数据结构

为了简单起见,我在修改后的示例脚本中包含了中的示例模式

关于第二个问题,我假设在输入中没有可选元素时,它们不会被放入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";
使用严格;
使用警告;
使用数据::转储程序;
使用XML::Compile::Schema;
使用XML::LibXML;
my$schema=XML::Compile::schema->new(q{
} );
#这将返回示例Perl数据结构的字符串表示形式
我的$template=$schema->template('PERL','addresses');
打印“模板:\n$template\n\n”;
#将字符串表示转换为实际的Perl数据结构
我的$sample;
评估“\$sample=$template;”;
打印“模板转换为Perl数据结构:\n”;
打印转储程序(示例);
打印“\n\n”;
#从示例Perl数据结构创建XML
我的$doc=XML::LibXML::Document->new('1.0','UTF-8');
我的$write=$schema->compile(WRITER=>'addresses');
my$xml=$write->($doc,$sample);
$doc->setDocumentElement($xml);
打印“生成的XML:\n”;
打印$doc->toString(1);
打印“\n\n”;

当然可以,但我没有找到一种方法将perl模板转换为perl数据结构,libXMLPlease可以使用它。请回答您的问题,并展示您迄今为止所做的尝试,这样我们就可以解决这个问题。请原谅我的无知,但是XSD文件已经是XML文件了。您的意思是希望将XSD解析为perl哈希,以便能够使用XML库处理它吗?