使用Perl创建XML时出现$tag未定义编译错误如何解决
错误原因
代码第18行使用了未声明的变量$tag:你在循环中创建XML元素节点时声明的变量名是$element,变量名笔误触发了use strict模式下的编译错误。
另外默认调用toString()方法输出的是无缩进、无换行的紧凑XML格式,和你预期的带缩进排版不符,需要额外传参开启格式化输出。
修复步骤
- 把第18行的
$tag->appendTextNode($value);修改为$element->appendTextNode($value);,将文本内容正确追加到当前创建的元素节点上。 - 将最后一行的
print $doc->toString();修改为print $doc->toString(1);,传入参数1开启格式化缩进,输出排版和预期一致。
修复后的完整可运行代码:
#!/usr/bin/env perl # # Create a simple XML document # use strict; use warnings; use XML::LibXML; my $doc = XML::LibXML::Document->new('1.0', 'utf-8'); my $root = $doc->createElement('my-root-element'); $root->setAttribute('some-attr'=> 'some-value'); my %elements = ( color => 'blue', metal => 'steel', ); for my $name (keys %elements) { my $element = $doc->createElement($name); my $value = $elements{$name}; $element->appendTextNode($value); $root->appendChild($element); } $doc->setDocumentElement($root); print $doc->toString(1);
补充说明
Perl原生哈希的键遍历顺序是不确定的,如果你需要严格固定子元素的输出顺序(比如color始终在metal之前),不要用哈希存储元素键值对,可以改用数组保证顺序:
my @elements = ( color => 'blue', metal => 'steel', ); for (my $i = 0; $i < @elements; $i += 2) { my $name = $elements[$i]; my $value = $elements[$i+1]; my $element = $doc->createElement($name); $element->appendTextNode($value); $root->appendChild($element); }
执行perl test2.pl即可正常输出符合预期格式的XML文档,不会再出现编译报错。
内容的提问来源于stack exchange,提问作者Monica
相关产品推荐
相关产品推荐

