如何通过XML::LibXML添加XML子标签及孙级嵌套节点
问题根因
你的代码生成的结构不符合预期,是三处写法错误导致的:
- 直接对
country节点调用appendText('Jamaica'),把国家名写成了country节点的直接文本,而不是dev下Name孙节点的内容 - 节点嵌套逻辑错误:创建
dev节点后直接给它加了文本value,没有继续在dev下挂载Name、field、range三个子节点 - 额外创建了预期结构里不存在的
location节点,且没有生成第二个USA对应的country节点
修正后可运行代码
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'); # 复用生成country节点的逻辑,传入国家名即可快速生成多个同结构节点 sub build_country_node { my ($doc, $name) = @_; my $country = $doc->createElement('country'); my $dev = $doc->createElement('dev'); # 逐个创建dev下的孙节点 my $name_elem = $doc->createElement('Name'); $name_elem->appendText($name); $dev->appendChild($name_elem); my $field_elem = $doc->createElement('field'); $field_elem->appendText('value'); $dev->appendChild($field_elem); my $range_elem = $doc->createElement('range'); $range_elem->appendText('value1'); $dev->appendChild($range_elem); $country->appendChild($dev); return $country; } # 追加两个国家节点 $root->appendChild(build_country_node($doc, 'Jamaica')); $root->appendChild(build_country_node($doc, 'USA')); $doc->setDocumentElement($root); print $doc->toString(1);
运行效果
执行代码后会输出和你预期完全一致的XML结构:
- 根节点携带
some-attr="some-value"属性 - 根下包含两个平级的
country节点 - 每个country节点下嵌套
dev子节点 - 每个dev节点下嵌套
Name/field/range三个孙节点,文本内容完全匹配预期
内容的提问来源于stack exchange,提问作者Monica
相关产品推荐
相关产品推荐

