【问题标题】:setAttribute doesn't affect toString of containing elementsetAttribute 不影响包含元素的 toString
【发布时间】:2018-10-04 08:59:23
【问题描述】:

这会打印 100 个 WOW,但不会在 toString 中打印一个 WOW。为什么?

for my $node ( $body->findnodes('//a') ) {
    $node->setAttribute( 'href', "WOW" );
}
for my $node ( $body->findnodes('//a') ) {
    print $node->getAttribute('href');
}

print $body->toString(2);

【问题讨论】:

  • $body是什么类型的对象,它访问的数据是什么。
  • 您在整个文档中搜索a 元素(因为您使用//a 而不是.//adescendant::a),文档中可能有100 个a 元素,但没有一个是$body 的后代。但我们无法确定,因为您没有证明您遇到的问题。请提供一个最小的、可运行的问题演示。 (见minimal reproducible example。)
  • 请注意,在您的 sn-p 前面加上 use XML::LibXML; my $doc = XML::LibXML->new->parse_string('<body><a></a><a></a></body>'); my $body = $doc;use XML::LibXML; my $doc = XML::LibXML->new->parse_string('<body><a></a><a></a></body>'); my ($body) = $doc->findnodes('body'); 不会产生您声明的输出。

标签: perl xml-attribute xml-libxml


【解决方案1】:

in the comment from Ikegami所述:

你在整个文档中搜索一个元素(因为你使用了 //a 而不是 .//a 或 descendant::a),并且可能有 100 个 a 文档中的元素,但没有一个是 $body 的后代

在这里输入'.//a' 而不是'//a' 是正确的方法。

【讨论】: