【问题标题】:How do I add child elements to XML using Perl's XML::Twig?如何使用 Perl 的 XML::Twig 将子元素添加到 XML?
【发布时间】:2009-08-11 11:07:47
【问题描述】:

我有以下 XML 文件:

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

现在,我想将子 &lt;CIFS_SERVICE NETBIOSNAME="serv2"/&gt; 添加到 &lt;SERVER HOSTNAME="serv2"&gt;。如何使用XML::Twig 执行此操作?

【问题讨论】:

  • 我重新格式化了您的帖子,以便 XML 可见。您的 XML 文件中真的没有关闭 &lt;/SOURCE_SERVER&gt; 吗?您的意思是要将&lt;CIFS_SERVICE NETBIOSNAME="serv2"&gt; 添加到&lt;SERVER HOSTNAME="serv1"&gt; 吗?请编辑您的帖子以反映正确的要求。
  • 我已经更正了思南
  • @Ninja 请参阅下面的答案。 &lt;CIFS_SERVICE NETBIOSNAME="serv1"&gt; 正确吗?不应该是&lt;CIFS_SERVICE NETBIOSNAME="serv1"/&gt;吗?否则,它不是 XML。
  • 是的,你是对的思南……这是一个错字……

标签: xml perl xml-twig


【解决方案1】:

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

#!/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>

【讨论】:

  • 思南,非常感谢您的回答。但是,我还有一个疑问。实际上我的 xml 看起来像这样:&lt;SOURCE_SERVER&gt; &lt;SERVER HOSTNAME="serv1"&gt; &lt;CIFS_SERVICE NETBIOSNAME="serv1"/&gt; &lt;/SERVER&gt; &lt;SERVER HOSTNAME="serv2"&gt; &lt;CIFS_SERVICE /&gt; &lt;/SERVER&gt; &lt;/SOURCE_SERVER&gt; 所以,我不需要插入 标签。树枝指向服务器,我需要设置它的子属性。我该怎么做?请帮帮我。
  • 非常感谢思南的回答!
猜你喜欢
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 2013-07-19
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多