我正在尝试更改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的值吗?
提前致谢
答案 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);
所以,在此之后,我得到了我想要的相同阵列。
感谢。