[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/</&lt;/g;
     $_[0] =~ s/>/&gt;/g   if $f & ESCAPE_GT;
     $_[0] =~ s/"/&quot;/g if $f & ESCAPE_ATTR;
     $_[0] =~ s/'/&apos;/g if $f & ESCAPE_ATTR && $f & ESCAPE_APOS;
   } else {
     $_[0] =~ s/([^\\]|^)&/$1&amp;/g;
               ^^^^^^^^^^^^^^^^^^^^^^^^
     $_[0] =~ s/\\&/&/g;
     $_[0] =~ s/([^\\]|^)</$1&lt;/g;
     $_[0] =~ s/\\</</g;


Bei escape = 'always', wird &nbsp; nicht escaped. Bei escape = 1 
hingegen schon. Effekt: bei escape = 'always' wird aus Strings, die z.B. 
"&nbsp;" enthalten, XML erzeugt, das XML::Simple nicht schlucken will 
(<tag attrib="blah &nbsp;"/> => 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