如何使用perl解析diffgam.xml文件,以获取哈希数组而不是大型哈希图?

用户名

我从服务获取以下diffgram XML:

<?xml version="1.0"?>
<xvcs:diffgram xmlns:xvcs="http://www.xvcs.org/">
  <xvcs:update id="7" first-child-of="/opt/node/node[1]">
    <xvcs:attr-update name="location" old-value="???" new-value="testlocation"/>
  </xvcs:update>
  <xvcs:update id="35" follows="/opt/node/node[2]">
    <xvcs:attr-update name="URL" old-value="/" new-value="/testurl/"/>
  </xvcs:update>
  <xvcs:insert id="75" first-child-of="/opt">
    <node node_id="/1234" location="new location" URL="/newurl"></node>
  </xvcs:insert>
</xvcs:diffgram>

我以这种方式用XML :: Simple解析它:

my $diffgram_hashref = XMLin($diffgram->toString(1),
                                KeepRoot    => 1,
                                ForceArray  => 1,
                        );

$logger->debug( dump($diffgram_hashref) );

并得到以下结果:

{
  "xvcs:diffgram" => [
    {
      "xmlns:xvcs"  => "http://www.xvcs.org/",
      "xvcs:insert" => {
                         75 => {
                                 "first-child-of" => "/opt",
                                 "node" => [
                                   {
                                     node_id    => "/1234",
                                     location   => "new location",
                                     URL        => "/newurl",
                                   },
                                 ],
                               },
                       },
      "xvcs:update" => {
                         7  => {
                                 "first-child-of"   => "/opt/node/node[1]",
                                 "xvcs:attr-update" => {
                                                         location => { "new-value" => "testlocation", "old-value" => "???" },
                                                       },
                               },
                         35 => {
                                 "follows" => "/opt/node/node[2]",
                                 "xvcs:attr-update" => {
                                        URL => { "new-value" => "/testurl/", "old-value" => "/" },
                                 },
                               },
                       },
    },
  ],
}

我尝试了几种ForeArray / KeyAttr组合,但是为了将diffgram语句(更新,插入)作为数组以正确的顺序进行处理,我没有实现:

{
  "xvcs:diffgram" => [
    {
      "xvcs:update" => {
                         7  => {
                                 "first-child-of"   => "/opt/node/node[1]",
                                 "xvcs:attr-update" => {
                                                         location => { "new-value" => "testlocation", "old-value" => "???" },
                                                       },
                               }
                        }
    },
    {
      "xvcs:update" => {
                         35 => {
                                 "follows" => "/opt/node/node[2]",
                                 "xvcs:attr-update" => {
                                        URL => { "new-value" => "/testurl/", "old-value" => "/" },
                                 },
                               },
                        }
    },
    {
      "xvcs:insert" => {
                         75 => {
                                 "first-child-of" => "/opt",
                                 "node" => [
                                   {
                                     node_id    => "/1234",
                                     location   => "new location",
                                     URL        => "/newurl",
                                   },
                                 ],
                               },
                       },
    }
  ]
}

有人可以帮我吗?

鲍罗丁

该程序使用XML::Twig模块执行您要执行的操作我已经忽略了顶级哈希键,xvcs:diffgram因为该哈希只有一个元素。同样适用于数组中的每个哈希-我更希望将element标签视为辅助哈希的元素之一的值,因为从目前的角度来看,您具有数组上的哈希。但是,我已经按照您的描述保留了此结构。

我还将idnameURL属性保留为简单的哈希元素,而不是像您的示例中那样对待它们。

Data::Dump仅用于显示根据数据构建的结构。

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new;
$twig->parse(\*DATA);

my @data;

for my $node ( $twig->root->children ) {

  my $atts = $node->atts;

  for my $child ($node->children) {
    $atts->{$child->tag} = $child->atts;
  }

  push @data, { $node->tag => $atts };
}

use Data::Dump;
dd \@data;



__DATA__
<?xml version="1.0"?>
<xvcs:diffgram xmlns:xvcs="http://www.xvcs.org/">
  <xvcs:update id="7" first-child-of="/opt/node/node[1]">
    <xvcs:attr-update name="location" old-value="???" new-value="testlocation"/>
  </xvcs:update>
  <xvcs:update id="35" follows="/opt/node/node[2]">
    <xvcs:attr-update name="URL" old-value="/" new-value="/testurl/"/>
  </xvcs:update>
  <xvcs:insert id="75" first-child-of="/opt">
    <node node_id="/1234" location="new location" URL="/newurl"></node>
  </xvcs:insert>
</xvcs:diffgram>

输出

[
  {
    "xvcs:update" => {
      "first-child-of" => "/opt/node/node[1]",
      "id" => 7,
      "xvcs:attr-update" => {
        "name" => "location",
        "new-value" => "testlocation",
        "old-value" => "???",
      },
    },
  },
  {
    "xvcs:update" => {
      "follows" => "/opt/node/node[2]",
      "id" => 35,
      "xvcs:attr-update" => {
        "name" => "URL",
        "new-value" => "/testurl/",
        "old-value" => "/",
      },
    },
  },
  {
    "xvcs:insert" => {
      "first-child-of" => "/opt",
      "id" => 75,
      "node" => {
        location => "new location",
        node_id => "/1234",
        URL => "/newurl",
      },
    },
  },
]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用perl解析diffgam.xml文件,以获取哈希数组而不是大型哈希图?

来自分类Dev

如何过滤哈希图数组

来自分类Dev

如何对包含数组的哈希图进行排序

来自分类Dev

如何获取哈希图中的arrayList的大小

来自分类Dev

如何使用XML :: LibXML解析XML文档并构建Perl哈希

来自分类Dev

如何使用XML :: LibXML解析XML文档并构建Perl哈希

来自分类Dev

如何从哈希数组中获取所需的哈希

来自分类Dev

如何在哈希而不是数组上使用Perl grep?

来自分类Dev

如何在哈希图中获取字符串和哈希图的混合值

来自分类Dev

如何将哈希图的键和值设置为xml文件的标记和值

来自分类Dev

如何预备哈希图?

来自分类Dev

如何使用Lambda获取哈希图中的值的键计数

来自分类Dev

从Perl哈希创建XML文件

来自分类Dev

如何从数组获取哈希值

来自分类Dev

如何在JavaScript中转换数组中的哈希图值?

来自分类Dev

如何将哈希图插入到对象数组中

来自分类Dev

使用Google gson的哈希图中的json数组

来自分类Dev

如何从哈希图中获取5个最高值?

来自分类Dev

如何获取哈希图的第一个键?

来自分类Dev

PHP-如何从哈希图片获取图像?

来自分类Dev

如何在哈希图中获取包含最新LocalDate的对象

来自分类Dev

如何在文件的哈希图中查找值的总和

来自分类Dev

如何使用查找从哈希数组中获取哈希?

来自分类Dev

使用文件中的json数据填充哈希图

来自分类Dev

使用文件中的json数据填充哈希图

来自分类Dev

如何使用其他哈希图的对象在哈希图中定义哈希图

来自分类Dev

Perl将不寻常的XML解析为哈希数组

来自分类Dev

如何在Perl中使用Weather :: NOAA :: Alert解析CAP ID而不是哈希值

来自分类Dev

如何从哈希图返回对象

Related 相关文章

  1. 1

    如何使用perl解析diffgam.xml文件,以获取哈希数组而不是大型哈希图?

  2. 2

    如何过滤哈希图数组

  3. 3

    如何对包含数组的哈希图进行排序

  4. 4

    如何获取哈希图中的arrayList的大小

  5. 5

    如何使用XML :: LibXML解析XML文档并构建Perl哈希

  6. 6

    如何使用XML :: LibXML解析XML文档并构建Perl哈希

  7. 7

    如何从哈希数组中获取所需的哈希

  8. 8

    如何在哈希而不是数组上使用Perl grep?

  9. 9

    如何在哈希图中获取字符串和哈希图的混合值

  10. 10

    如何将哈希图的键和值设置为xml文件的标记和值

  11. 11

    如何预备哈希图?

  12. 12

    如何使用Lambda获取哈希图中的值的键计数

  13. 13

    从Perl哈希创建XML文件

  14. 14

    如何从数组获取哈希值

  15. 15

    如何在JavaScript中转换数组中的哈希图值?

  16. 16

    如何将哈希图插入到对象数组中

  17. 17

    使用Google gson的哈希图中的json数组

  18. 18

    如何从哈希图中获取5个最高值?

  19. 19

    如何获取哈希图的第一个键?

  20. 20

    PHP-如何从哈希图片获取图像?

  21. 21

    如何在哈希图中获取包含最新LocalDate的对象

  22. 22

    如何在文件的哈希图中查找值的总和

  23. 23

    如何使用查找从哈希数组中获取哈希?

  24. 24

    使用文件中的json数据填充哈希图

  25. 25

    使用文件中的json数据填充哈希图

  26. 26

    如何使用其他哈希图的对象在哈希图中定义哈希图

  27. 27

    Perl将不寻常的XML解析为哈希数组

  28. 28

    如何在Perl中使用Weather :: NOAA :: Alert解析CAP ID而不是哈希值

  29. 29

    如何从哈希图返回对象

热门标签

归档