如何在XML :: Simple的输出中订购标签?
这是我的情景:
我需要通过Perl生成XML,其中模式充满了< xs:sequence>标签(即标签必须按顺序出现).我无法控制架构(第三方),每当我们添加新的CPAN模块(没有很好的方式将它们传播给客户等)时,我们已经基本上禁止这些模块出现了很多问题.添加任何新内容(如XML :: Writer). 我可以使用的XML模块是:XML :: Parser,XML :: Simple,XML :: XPath. 我非常喜欢XML :: Simple中的方式你创建一个hashref w / hash / arary refs数据结构,然后只是吐出XML. 无论如何使用XML :: Simple做到这一点?或者也许滚动我自己的代码按顺序吐出XML?似乎我最大的问题是我需要以插入顺序从hashref中提取内容,而Perl并没有真正做到这一切.我确实读过关于Tie :: IxHash的插件顺序,但是同样是我没有的模块. 感觉我有点像SOL,但肯定会感谢有人可能有的任何技巧/想法.谢谢. 解决方法
大多数情况下,只需使用XML :: Simple提供的选项即可完成配置.通常情况下,它会自动将数据折叠成数据结构的简单数据,可以逻辑再现;它非常适合数据存储格式,但在匹配文档格式方面却不那么强大.幸运的是,即使它“简单”,它也非常强大.
要控制元素的输出顺序,您有几个选项.您可以使用数组,它保证数据的顺序.但是,看起来您需要一个标签的特定值顺序. 密钥排序也是一种自动功能.只要您拥有的键是按字母顺序排列的,它们就会保证按特定顺序排序. 但很多时候,特别是对于非常具体的模式,这是行不通的.幸运的是,XML :: Simple仍然支持一种自定义方式:必须使用OO接口,并覆盖sorted_keys方法.这是一个例子: use strict; use warnings; use XML::Simple; use Data::Dumper; package MyXMLSimple; # my XML::Simple subclass use base 'XML::Simple'; # Overriding the method here sub sorted_keys { my ($self,$name,$hashref) = @_; if ($name eq 'supertag') # only this tag I care about the order; { return ('tag1','tag3','tag4','tag10'); # so I specify exactly the right order. } return $self->SUPER::sorted_keys($name,$hashref); # for the rest,I don't care! } package main; # back to main code my $xmlParser = MyXMLSimple->new( # Create the parser,with options: KeepRoot => 1,# gives us our root element always. ForceContent => 1,# ensures that content stays special ); my $structure = { supertag => { tag1 => { content => 'value 1' },tag10 => { content => 'value 2' },tag3 => { content => 'value 3' },tag4 => { content => 'value 4' },},}; my $xml = $xmlParser->XMLout($structure); print "The xml generated is:n$xmln"; print "The read in structure then is:n" . $xmlParser->XMLin($xml) . "n"; 这将给我们: The xml generated is: <supertag> <tag1>value 1</tag1> <tag3>value 3</tag3> <tag4>value 4</tag4> <tag10>value 2</tag10> </supertag> The read in structure then is: $VAR1 = { 'supertag' => { 'tag10' => { 'content' => 'value 2' },'tag3' => { 'content' => 'value 3' },'tag1' => { 'content' => 'value 1' },'tag4' => { 'content' => 'value 4' } } }; 查看CPAN上的XML::Simple页面. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |