如何为XML::LibXML生成的XML输出逐行添加换行与缩进?
问题描述
使用XML::LibXML生成XML文档时,默认toString()方法输出的所有子标签会拼接在同一行,仅在文档末尾手动添加换行符无法实现标签分层换行、缩进的格式化效果,目标输出为按标签层级换行、带对应缩进的易读XML格式。
原有测试代码:
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 $tag = $doc->createElement($name); my $value = $elements{$name}; $tag->appendTextNode($value); $root->appendChild($tag); } $doc->setDocumentElement($root); print $doc->toString();
默认运行输出:
%> perl test2.pl <?xml version="1.0" encoding="utf-8"?> <my-root-element some-attr="some-value"><color>blue</color><metal>steel</metal></my-root-element>
期望输出效果:
<?xml version="1.0" encoding="utf-8"?> <my-root-element some-attr="some-value"> <color>blue</color> <metal>steel</metal> </my-root-element>
实现方法
XML::LibXML内置了格式化输出的配置项,不需要手动拼接换行符。在输出前开启缩进配置、指定缩进字符串即可实现目标效果:
- 调用
setIndent(1)开启文档输出的自动缩进、换行逻辑 - 调用
setIndentString($str)自定义缩进使用的字符,传入4个空格即可匹配预期的缩进宽度
之前尝试在toString()结果后手动追加换行符无效,是因为该操作仅会在整个XML文档的末尾添加字符,无法控制各层级标签之间的排版逻辑,标签间的换行、缩进需要通过模块内置的序列化配置控制。
修改后的完整可运行代码:
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 $tag = $doc->createElement($name); my $value = $elements{$name}; $tag->appendTextNode($value); $root->appendChild($tag); } $doc->setDocumentElement($root); # 开启格式化输出配置 $doc->setIndent(1); $doc->setIndentString(" "); print $doc->toString();
运行上述代码即可得到符合预期的带换行、缩进的XML输出。
说明:如果需要更复杂的格式化规则(比如属性换行、空标签自定义样式等),可以搭配XML::LibXML::PrettyPrint模块实现更灵活的美化配置,常规场景下内置配置已足够使用。
内容的提问来源于stack exchange,提问作者Monica
相关产品推荐
相关产品推荐

