【问题标题】:Add attribute to xml with XML::Simple使用 XML::Simple 向 xml 添加属性
【发布时间】:2013-07-29 08:12:14
【问题描述】:

我正在尝试使用 XML::Simple 向现有 XML 添加属性。

<arbre>
  <branche name="courbe" >
    <description>
      <![CDATA[une belle branche]]>
    </description>
    <feuilles>
      <fleur color="blue" order="1" />
      <fleur color="white" order="2" />
      <fleur color="yellow" order="3" />
    </feuilles>
  </branche>
  <branche name="droite" >
    <description>
      <![CDATA[une branche commune]]>
    </description>
    <feuilles>
      <fleur color="purple" order="1" />
      <fleur color="green" order="2" />
    </feuilles>
  </branche>
</arbre>

我正在尝试转变为:

<arbre>
  <branche name="courbe" type="conifere">
    <description>
      <![CDATA[une belle branche]]>
    </description>
    <feuilles>
      <fleur color="blue" order="1" />
      <fleur color="white" order="2" />
      <fleur color="yellow" order="3" />
    </feuilles>
  </branche>
  <branche name="droite" type="resineux">
    <description>
      <![CDATA[une branche commune]]>
    </description>
    <feuilles>
      <fleur color="purple" order="1" />
      <fleur color="green" order="2" />
    </feuilles>
  </branche>
</arbre>

注意分支标签中的 type 属性。
到目前为止,我有以下内容:

#!/usr/bin/env perl -w

use strict;
use XML::Simple;
use Data::Dumper;

my $funclist = XML::Simple->new();
my $arbres   = $funclist->XMLin("test.xml");

print Dumper($arbres);
exit 0;

根据我从文档中了解到的 $arbres 是一个哈希,我必须在每个分支键中插入类型属性键和值。
除了我不知道在哪里以及如何($arbres{something} = "conifere" ?)。
谢谢

【问题讨论】:

  • XML::Simple 通常远非简单易用,并且它自己的文档说 “不鼓励在新代码中使用此模块。其他模块可用,它们提供更直接和一致接口。特别是,强烈推荐 XML::LibXML。这个模块的主要问题是大量的选项和这些选项交互的任意方式 - 通常会产生意想不到的结果。"

标签: perl xml-parsing


【解决方案1】:

使用XML::XSH2,对XML::LibXML 进行包装

open test.xml ;
for //branche[@name='courbe'] set @type 'conifere' ;
for //branche[@name='droite'] set @type 'resineux' ;
save :b ;

【讨论】:

    【解决方案2】:
    use strict;
    use warnings FATAL => 'all';
    use XML::Simple qw();
    
    my %branche_map = (
        courbe => 'conifere',
        droite => 'resineux',
    );
    my $xs = XML::Simple->new(StrictMode => 1, ForceArray => 1, KeyAttr => undef, RootName => 'arbre');
    my $arbres = $xs->XMLin('test.xml');
    
    for my $branche (@{ $arbres->{branche} }) {
        $branche->{type} = $branche_map{ $branche->{name} };
    }
    print $xs->XMLout($arbres)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 2019-12-20
      相关资源
      最近更新 更多