[Vienna-pm] XML::Generator - Bug?
Marinos Yannikos
mjy at geizhals.at
Fri Apr 15 11:59:22 PDT 2005
Haltet ihr das auch für einen Bug? Für mich sind noch einige Dinge bei
den XML:*-Modulen nicht ganz nachvollziehbar, aber das hier ist etwas
merkwürdig - /usr/share/perl5/XML/Generator.pm:
my $f = $_[1];
if ($_[1] & ESCAPE_ALWAYS) {
$_[0] =~ s/&(?!(#[0-9]+|#x[0-9a-fA-F]+|\w+);)/&/g;
^^^^^^
$_[0] =~ s/</</g;
$_[0] =~ s/>/>/g if $f & ESCAPE_GT;
$_[0] =~ s/"/"/g if $f & ESCAPE_ATTR;
$_[0] =~ s/'/'/g if $f & ESCAPE_ATTR && $f & ESCAPE_APOS;
} else {
$_[0] =~ s/([^\\]|^)&/$1&/g;
^^^^^^^^^^^^^^^^^^^^^^^^
$_[0] =~ s/\\&/&/g;
$_[0] =~ s/([^\\]|^)</$1</g;
$_[0] =~ s/\\</</g;
Bei escape = 'always', wird nicht escaped. Bei escape = 1
hingegen schon. Effekt: bei escape = 'always' wird aus Strings, die z.B.
" " enthalten, XML erzeugt, das XML::Simple nicht schlucken will
(<tag attrib="blah "/> => Bumm).
Im Grunde möchte ich nur wohlgeformtes XML aus einem Perl-hash erzeugen,
das auch wieder gelesen werden kann (auch von anderen XML-Parsern) - und
das ohne DTDs.
So funktioniert das nun:
use XML::Generator; $gen=XML::Generator->new(':pretty', escape => 1);
print $gen->xmldecl(encoding => 'ISO-8859-1'),
$gen->bla($hash);
(aber eben nicht mit escape => 'always')
Eingelesen wird das Zeug dann z.B. mit Template::Toolkit und dem
XML::Simple Plugin:
[% USE xml = XML.Simple(xmlfile) %]
[% xml.attrib1 %]
Sogar Umlaute werden korrekt wiedergegeben (da darf man sich ja freuen).
Gibt es eine elegantere / zuverlässigere Methode oder bekannte Probleme
mit dieser Vorgangsweise? Mir graut jedenfalls schon vor dem Testen der
Unicode=>Unicode Variante...
MfG,
-mjy
More information about the Vienna-pm
mailing list