如何使用XMLout函数设置值并发送回xml

时间:2015-08-20 11:30:23

标签: xml perl

我正在尝试更改xml的值,然后重新设置为第一个。

这是我的XML内容。

$VAR1 = {
        'demo' => 
    '<?xml version="1.0"?>
    <cdr core-id="fefab0d8" switchname="test">
    <channel_data>
        <state>CS_REPORTING</state>
        <direction>test</direction>
        <state_number>11</state_number>
    </channel_data>
     <callflow dialplan="XML" unique-id="dba49e51" profile_index="1">
        <extension name="123456 " number="123456">
    </callflow>
    </cdr>'
 };

因此,我使用XMLin函数获取此xml。

use XML::Simple;
my $xml = new XML::Simple;
$data = $xml->XMLin($xml123->{demo});

现在我将值更改为$ data-&gt; {channel_data} - &gt; {state_number} = 12;

我使用$xml->XMLout($data);

更改值后,我需要设置回正常的xml并将其发送到另一个进程。

任何人都可以了解如何在不影响其节点的情况下更改XML的值吗?

提前致谢

3 个答案:

答案 0 :(得分:4)

  

任何人都可以了解如何在不影响其节点的情况下更改XML的值吗?

是的,不要使用XML :: Simple。它的文档警告你不要使用它。

  

不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。特别强烈建议使用XML :: LibXML。

使用XML :: LibXML:

my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($xml123->{demo});

$_->setData(12)
   for $doc->findnodes('/cdr/channel_data/state_number/text()');

$doc->toString(\*STDOUT);

答案 1 :(得分:1)

你面临的问题是XML :: Simple读取了很多东西,但不是很擅长将同样的东西复制回XML。你需要设置一堆选项来实现你想要的。 But since even the XML::Simple documentation discourages its use,因为它根本不简单,我建议使用不同的XML解析器。

例如,使用XML::Twig可以轻松完成此任务。

use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig->new(
  twig_handlers => {
    state_number => sub {
      $_->set_text( $_->text + 1);
    }
  }
);
$twig->parse(\*DATA);
$twig->print;

__DATA__
<?xml version="1.0"?>
<cdr core-id="fefab0d8" switchname="test">
  <channel_data>
      <state>CS_REPORTING</state>
      <direction>test</direction>
      <state_number>11</state_number>
  </channel_data>
   <callflow dialplan="XML" unique-id="dba49e51" profile_index="1">
      <extension name="123456 " number="123456" />
   </callflow>
</cdr>

<强>输出:

<?xml version="1.0"?>
<cdr core-id="fefab0d8" switchname="test"><channel_data><state>CS_REPORTING</state><direction>test</direction><state_number>12</state_number></channel_data><callflow dialplan="XML" profile_index="1" unique-id="dba49e51"><extension name="123456 " number="123456"/></callflow></cdr>

答案 2 :(得分:0)

我终于使用XMLout函数实现了它。

获取数组时我刚刚添加了2个参数"KeepRoot"=>1, ForceArray => 1

$data = $xml->XMLin($xml123->{demo},`"KeepRoot"=>1, ForceArray => 1`);

所以在那之后我将获得正确的数组,然后在我使用XMLout函数更改后。

$data->{demo}->[0]->{channel_data}->[0]->{state_number}->[0] = 12;


my $data1 = $xml->XMLout($data,"KeepRoot"=>1);

所以,在此之后,我得到了我想要的相同阵列。

感谢。