加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 22:40:32 所属栏目:百科 来源:网络整理
导读:这是我的情景: 我需要通过Perl生成XML,其中模式充满了 xs:sequence标签(即标签必须按顺序出现).我无法控制架构(第三方),每当我们添加新的CPAN模块(没有很好的方式将它们传播给客户等)时,我们已经基本上禁止这些模块出现了很多问题.添加任何新内容(如XML ::
这是我的情景:

我需要通过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页面.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读