2011-05-27 51 views
2

默認情況下,LibXML將呈現空標記爲<tag />,但我需要讓它呈現爲<tag></tag>Perl/LibXML:在序列化時保持結束標記

有沒有我在文檔中遺漏的選項,還是我必須用正則表達式替換(或任何其他解決方案,你可能知道)tweek輸出?

我尋找的地方做一個更好的辦法:

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

在XML中,它們是等效的。爲什麼你的特殊需要?有些東西不是按照規則玩的。 – daxim 2011-05-27 12:28:36

+1

我知道。我不會解釋爲什麼我需要這個。我只需要相信我。 – glmxndr 2011-05-27 12:35:02

回答

3

的libxml有formerly documented feature ,可能會被視爲棄用,因爲它不在最新版本的文檔中,但它仍然是in the test files,所以它可能工作。

所有序列化函數都理解標誌setTagCompression。如果此標誌設置爲1,空標記顯示爲<foo> </foo >而不是< foo/>。

my $xml = do { 
    local $XML::LibXML::setTagCompression = 1; 
    $doc->toString(); 
}; 
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>