Perl / LibXML:在序列化时保持关闭标记

时间:2011-05-27 11:54:52

标签: perl libxml2

默认情况下,LibXML会将空标记呈现为<tag />,但我需要将它们呈现为<tag></tag>

我在文档中是否遗漏了一个选项,或者我是否需要使用regexp替换(或您可能知道的任何其他解决方案)来调整输出?

我正在寻找一种更好的方法来代替:

$xml = $dom->serialize(0);
$xml =~ s/<([a-z]+)([^>]*?)\/>/<$1$2><\/$1>/gsi;

2 个答案:

答案 0 :(得分:3)

怎么样:

use XML::LibXML;

my $x = XML::LibXML->new();
my $d = $x->load_xml(string => "<xml><foo/></xml>");

print $d->toString;

print qq{<?xml version="1.0"?>\n} . $d->toStringHTML();'

的产率:

<?xml version="1.0"?>
<xml><foo/></xml>

<?xml version="1.0"?>
<xml><foo></foo></xml>

答案 1 :(得分:3)

LibXML有一个formerly documented feature,可能会被视为已弃用,因为它不在最新版本的文档中,但它仍然是in the test files,因此可能会有效。

  

所有序列化函数都了解标志setTagCompression。如果此标记设置为1,则空标记显示为&lt; foo&gt;&lt; / foo&gt;而不是&lt; foo /&gt;。

my $xml = do {
    local $XML::LibXML::setTagCompression = 1;
    $doc->toString();
};