当前位置 : 主页 > 网页制作 > xml >

如何在XML :: Simple的输出中订购标签?

来源:互联网 收集:自由互联 发布时间:2021-06-13
这是我的情景: 我需要通过Perl生成XML,其中模式充满了 xs:sequence标签(即标签必须按顺序出现).我无法控制架构(第三方),每当我们添加新的CPAN模块(没有很好的方式将它们传播给客户等
这是我的情景:

我需要通过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$xml\n";
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页面.

网友评论