【问题标题】:what are restrictions on using parse in xml-twig to parse xml string在 xml-twig 中使用 parse 来解析 xml 字符串有什么限制
【发布时间】:2012-10-22 19:50:34
【问题描述】:

我正在尝试使用 $twig->parse($xmlstring) 将 id 属性添加到字符串中的所有 xml 元素。每个字符串都是数组的一个元素,类似于:

<classes name="Test::Class">
  <public_methods>
    <members const="no" kind="function" name="RegisterDefinition" volatile="no">
      <parameters declaration_name="name" type="std::string"/>
      <parameters declaration_name="description" type="std::string"/>
    </members>
  </public_methods>
</classes>

在脚本中,我使用 foreach 循环来获取每个元素并创建 id 属性。

foreach my $str (@newonly) {
   $twig->parse( $str );
}

我创建了调用例程的 twig 对象和 TwigHandler,它仅在我使用 parsefile 并指定 xml 文件时才有效。如果我使用 parse 来解析作为数组元素的 xml 文件的一部分,则不起作用。 我正在使用的例程是:

my $twig = XML::Twig->new(
 TwigHandlers => {
   '_all_' => \&add_id,
 },
);


sub add_id 
 { my($twig, $element)= @_;
   $element->set_id($id++);
   $twig->purge;
 }

【问题讨论】:

  • “不起作用”是什么意思?预期的结果是什么?
  • 预计会在每个元素“id = 1”等中看到新属性。如果我在 xml 文件上使用 parsefile 但如果我在字符串上使用 parse 则不行。猜猜我的问题是我尝试解析的字符串是否有效,如 Test::Class 字符串示例中所示。

标签: perl xml-twig


【解决方案1】:

来自documentation

解析($source)

$source 参数应该是包含整个 XML 文档的字符串,或者应该是打开的 IO::Handle(又名文件句柄)。

【讨论】:

    【解决方案2】:

    我对在处理程序末尾使用$twig-&gt;purge 感到困惑。当你这样做时,你会失去你刚刚建立的所有结构。我认为您确实创建了 id,但是当您清除树枝时会丢失它们。

    您可能应该删除对purge 的调用并在classes 上添加一个处理程序,该处理程序可以将树枝用于您需要的任何用途,然后在完成后将其清除。

    【讨论】:

    • 删除了清除调用,但发现我的问题是 id 属性被添加到作为数组元素的字符串中的所有 xml 元素中,但是,没有写回数组中的元素。稍后脚本中再次使用数组,但字符串在添加 id 属性之前处于原始状态。
    • 当然,twig 不是字符串,它是由字符串构建的。您需要将数组元素设置为 XML 的序列化,即$array[$i]= $twig-&gt;sprint,或者在您的情况下为foreach my $str (@newonly) { $str= $t-&gt;parse( $str)-&gt;sprint; }(在foreach 循环中,“光标”是原始变量的别名,请参阅讨论perldoc perlsyn中的foreach循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2010-12-23
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多