【问题标题】:How can I add an attribute to a child element using Perl's XML::Twig?如何使用 Perl 的 XML::Twig 向子元素添加属性?
【发布时间】:2010-11-18 20:49:48
【问题描述】:

我有一个这样的 XML 字符串:

<DATA>
   <CHILD_DATA ATVAL="value1"/>
   <CHILD_DATA />
</DATA>

我想要的最终输出是:

<DATA>
   <CHILD_DATA ATVAL="value1"/>
   <CHILD_DATA ATVAL="value2"/>
</DATA>

我的树枝$t&lt;DATA&gt;。现在我想为第二个&lt;CHILD_DATA /&gt; 添加一个属性。属性为ATVAL="value2"。我尝试了以下方法:

$t->last_child('CHILD_DATA')->set_att{"ATVAL","value2"};

这不起作用。这段代码有什么问题?还有另一种方法可以做到这一点吗?

【问题讨论】:

  • 您知道您可以编辑自己的问题吗?
  • 好的,所以...让我告诉你一个小秘密。 "$object->method{"list", "items"}" 不是有效的 Perl 语法。
  • 你能告诉我我该怎么做吗?
  • 到目前为止,您已经提出了两个与 XML::Twig 密切相关的问题,并且都得到了正确答案。然而,您还没有接受任何一个问题的答案。接受可以解决您问题的答案(通过单击旁边的复选标记)是一种礼貌。
  • 另外,一点耐心也会有所帮助。也许您不喜欢 Jon 的提示,但请稍等:其他人会醒来,喝杯咖啡,然后查看 Stackoverflow。 :)

标签: xml perl xml-twig


【解决方案1】:

只是一些想法:

  1. 多次发布相同的问题 时代不会讨好任何人 来帮助你。

  2. 您的代码甚至没有语法 正确,所以我并不惊讶你 遇到问题。

  3. 为什么不包括您遇到的错误 得到?也许这可能会减少一些 解决问题了吗?

【讨论】:

  • 你好以太。我曾问过类似的问题,但不一样。我想知道一种方法,我们可以设置已经存在的子元素的属性,而不是插入新元素。在这种情况下, 已经存在,我只需要将属性添加到第二个 标记。我还尝试了以下方法: $elt = $t->root->last_child('CHILD_DATA'); $elt->set_att("ATVAL","value2");但它没有帮助。请帮帮我
  • “它没有帮助”不是很具体。您尝试了什么,结果如何?
  • 好的...这是图片。我的树枝根变量 $t 指向&lt;DATA&gt;。我只想访问它的孩子并设置它的属性,就像我在问题中所说的那样。请阐明如何做到这一点。忘记我做了什么,反正那是错的。
【解决方案2】:

正如 Jon 向您暗示的那样,您发布的代码中存在语法错误。你应该看到如下编译错误:

测试第 18 行的语法错误,“->set_att{”附近 由于编译错误,program.pl 的执行中止。

但是,您可能在答案中输入了代码,因此代码与您实际执行的操作不匹配。始终将实际代码放入您的问题中,而不是重新输入它,并尽可能发布完整的程序。当你发布你的程序时,我不必从头开始调试我认为你可能正在做的事情。 :)

这里有一个程序可以满足您的需求:

use XML::Twig;

my $xml = <<'XML';
<DATA>
   <CHILD_DATA ATVAL="value1"/>
   <CHILD_DATA />
</DATA>
XML

my $twig= XML::Twig->new( keep_spaces => 1 );

$twig->parse( $xml );

$twig
    ->root
    ->last_child('CHILD_DATA')
    ->set_att("ATVAL" => "value2");

$twig->flush;

【讨论】:

  • 我可能在这里误解了,但我虽然你在一开始就说过我的代码部分:"$t->last_child('CHILD_DATA')->set_att{"ATVAL","value2 “};”语法不正确?但是您在解决方案中使用了相同的代码?
  • @Ninja:略有不同...布赖恩正在使用 set_att() 但您的代码和评论显示 set_att{} 即。你正在使用花括号 {} 而不是括号 ()
  • @Ninja,我不知道你是如何看待你的代码的,但如果你是新手,我怀疑你没有使用好的程序员字体,这使得 { 和(。有些字体可以使差异非常明显,并且很容易从几英尺外发现。:)
  • 一种风格评论:我喜欢用粗逗号和set_att: set_att(ATVAL => "value2");也许这只是我,但它看起来更好,毕竟属性与哈希非常相似(键必须是唯一的,它们不被认为是有序的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多