如何使用 Perl 的 XML::Twig 将子元素添加到 XML?

发布于 2024-07-30 18:14:17 字数 479 浏览 7 评论 0原文

我有以下 XML 文件:

<SOURCE_SERVER>
  <SERVER HOSTNAME="serv1">
      <CIFS_SERVICE NETBIOSNAME="serv1"/>
  </SERVER>
  <SERVER HOSTNAME="serv2">
  </SERVER>
<SOURCE_SERVER>

现在,我想将子 添加到 。 如何使用 XML::Twig 执行此操作?

I have the following XML file:

<SOURCE_SERVER>
  <SERVER HOSTNAME="serv1">
      <CIFS_SERVICE NETBIOSNAME="serv1"/>
  </SERVER>
  <SERVER HOSTNAME="serv2">
  </SERVER>
<SOURCE_SERVER>

Now, I want to add child <CIFS_SERVICE NETBIOSNAME="serv2"/> to <SERVER HOSTNAME="serv2">. How do I do this using XML::Twig?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

溺深海 2024-08-06 18:14:17

这是一个解决方案,其中包含我认为对您的问题的合理修复。 下面的代码基于文档中给出的过滤示例

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $t = XML::Twig->new(
    twig_roots => { SERVER => \&update },
    twig_print_outside_roots => 1,
);

$t->parse(\*DATA);

sub update {
    my ($t, $server) = @_;
    if ( 'serv2' eq $server->att('HOSTNAME') ) {
        $server->insert(
            CIFS_SERVICE => { NETBIOSNAME => 'serv2' },
        );
    }
    $server->print;
}


__DATA__
<SOURCE_SERVER>
  <SERVER HOSTNAME="serv1">
      <CIFS_SERVICE NETBIOSNAME="serv1" />
  </SERVER>
  <SERVER HOSTNAME="serv2">
  </SERVER>
</SOURCE_SERVER>

输出:

C:\Temp> x
<SOURCE_SERVER>
  <SERVER HOSTNAME="serv1"><CIFS_SERVICE NETBIOSNAME="serv1"/></SERVER>
  <SERVER HOSTNAME="serv2"><CIFS_SERVICE NETBIOSNAME="serv2"/></SERVER>
</SOURCE_SERVER>

Here is a solution incorporating what I think are reasonable fixes to your question. The code below is based on the filtering example given in the documentation.

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $t = XML::Twig->new(
    twig_roots => { SERVER => \&update },
    twig_print_outside_roots => 1,
);

$t->parse(\*DATA);

sub update {
    my ($t, $server) = @_;
    if ( 'serv2' eq $server->att('HOSTNAME') ) {
        $server->insert(
            CIFS_SERVICE => { NETBIOSNAME => 'serv2' },
        );
    }
    $server->print;
}


__DATA__
<SOURCE_SERVER>
  <SERVER HOSTNAME="serv1">
      <CIFS_SERVICE NETBIOSNAME="serv1" />
  </SERVER>
  <SERVER HOSTNAME="serv2">
  </SERVER>
</SOURCE_SERVER>

Output:

C:\Temp> x
<SOURCE_SERVER>
  <SERVER HOSTNAME="serv1"><CIFS_SERVICE NETBIOSNAME="serv1"/></SERVER>
  <SERVER HOSTNAME="serv2"><CIFS_SERVICE NETBIOSNAME="serv2"/></SERVER>
</SOURCE_SERVER>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文