我试图在XML::LibXML
的XML输出中为每个<>
行添加换行符从https://stackoverflow.com/a/2934794/19508169 .
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输出添加换行符?
如果将" n"
加入print $doc->toString();
作为print $doc->toString(), " n";
,则不起作用。
用$doc->toString(1)
代替$doc->toString()
。
可以说,找到正确的文档并不容易,因为XML::LibXML的页只包含指向其他页面的链接。您仍然可以执行print ref $doc
,它输出XML::LibXML::Document
:现在您知道需要查看XML::LibXML::Document的文档。在这里,您将找到toString
:
$docstring = $dom->toString($format);
[…]
如果$format为1,libxml2将添加可忽略的空白,因此节点的内容更容易阅读。
[…]
toString()
方法(在XML::LibXML::Document中记录)有一个可选的数字参数,用于更改输出的格式。
toString
$docstring = $dom->toString($format);
toString是DOM序列化函数,因此DOM树被序列化为XML字符串,准备输出。
重要:与其他节点的toString不同,在文档节点上this函数将XML作为原始编码的字节字符串返回文档(参见actualEncoding()方法)!这意味着你可以只是做:
open my $out_fh, '>', $file; print {$out_fh} $doc->toString;
,而不考虑文档的实际编码。请参阅在XML::LibXML中进行编码。
可选参数$format设置输出的缩进。这参数应该是一个整数值,它指定应该使用缩进。format参数可以有三个
如果$format为0,则文档按原始格式转储解析
如果$format为1,libxml2将添加可忽略的空白,因此节点内容更容易阅读。现有的文本节点将不会被修改
如果$format为2(或更大),libxml2将作为$format == 1,但它将作为$format == 1为每个文本节点添加一个前后换行符
libxml2使用硬编码缩进,每个缩进2个空格字符缩进级别。此值不能在运行时更改。
值"1"给出你想要的结果。
print $doc->toString(1);
输出:
<?xml version="1.0" encoding="utf-8"?>
<my-root-element some-attr="some-value">
<metal>steel</metal>
<color>blue</color>
</my-root-element>