Perl / LibXML: продолжайте закрывать теги при сериализации - PullRequest
2 голосов
/ 27 мая 2011

По умолчанию LibXML будет отображать пустые теги как <tag />, но мне нужно, чтобы они отображали их как <tag></tag>.

Есть ли опция, которую я пропустил в документации, или мне нужно настроить вывод с заменами регулярных выражений (или любым другим решением, о котором вы можете знать)?

Я ищу лучший способ сделать это вместо:

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

Ответы [ 2 ]

3 голосов
/ 27 мая 2011

LibXML имеет ранее задокументированную функцию , которая может считаться устаревшей, поскольку ее нет в документации к последней версии, но она все еще в тестовых файлах , поэтому она может работать.

Все функции сериализации понимают флаг setTagCompression.если для этого флага установлено значение 1, пустые теги отображаются как , а не как.

my $xml = do {
    local $XML::LibXML::setTagCompression = 1;
    $doc->toString();
};
3 голосов
/ 27 мая 2011

Как насчет:

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>
...