Package: libxml-mini-perl
Version: 1.2.8-2
According to the XML 1.1 W3C Recommendation
(http://www.w3.org/TR/2004/REC-xml11-20040204/) section 2.8 the XML header is
declared as
XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S?'?>'
which means that the version attribute is supposed to be left from the
encoding. Unfortunately the header class of XML::Mini always sorts its
attributes alphabetically before printing, which makes it impossible to create
a header that is accepted by a different program using libxml.
I have included an example program, as well as a patch fixing the problem
mentioned above.
Regards
Marc Laue
#! /usr/bin/perl
use strict;
use XML::Mini::Document;
my $doc=XML::Mini::Document->new();
my $root=$doc->getRoot();
my $header=$root->prependChild(XML::Mini::Element::Header->new('xml'));
$header->attribute('version','1.0');
$header->attribute('encoding','UTF-8');
print $doc->toString(),"\n";
diff -ur libxml-mini-perl-1.2.8.orig/lib/XML/Mini/Element/Header.pm
libxml-mini-perl-1.2.8/lib/XML/Mini/Element/Header.pm
--- libxml-mini-perl-1.2.8.orig/lib/XML/Mini/Element/Header.pm 2003-01-26
08:44:01.000000000 +0000
+++ libxml-mini-perl-1.2.8/lib/XML/Mini/Element/Header.pm 2005-10-26
08:18:35.000000000 +0000
@@ -40,9 +40,32 @@
my $retString = "$spaces<?". $self->name() . ' ';
my $attribString;
+
+ # ensure the order of attributes inside the header conforms to W3C
+ # Recommendation for XML 1.1
+ my $atValue;
+ $atValue = $self->{'_attributes'}->{'version'};
+ if (defined $atValue)
+ {
+ $attribString .= qq|version="$atValue" |;
+ }
+ $atValue = $self->{'_attributes'}->{'encoding'};
+ if (defined $atValue)
+ {
+ $attribString .= qq|encoding="$atValue" |;
+ }
+ $atValue = $self->{'_attributes'}->{'standalone'};
+ if (defined $atValue)
+ {
+ $attribString .= qq|standalone="$atValue" |;
+ }
+
foreach my $atName (sort keys %{$self->{'_attributes'}})
{
- $attribString .= qq|$atName="$self->{'_attributes'}->{$atName}" |;
+ if (($atName ne 'version') && ($atName ne 'encoding') && ($atName ne
'standalone'))
+ {
+ $attribString .= qq|$atName="$self->{'_attributes'}->{$atName}" |;
+ }
}
if (defined $attribString && $attribString =~ m|\S|)
@@ -64,10 +87,34 @@
my $retString = '<? ' . $self->name();
my $attribString;
+
+ # ensure the order of attributes inside the header conforms to W3C
+ # Recommendation for XML 1.1
+ my $atValue;
+ $atValue = $self->{'_attributes'}->{'version'};
+ if (defined $atValue)
+ {
+ $attribString .= qq|version="$atValue" |;
+ }
+ $atValue = $self->{'_attributes'}->{'encoding'};
+ if (defined $atValue)
+ {
+ $attribString .= qq|encoding="$atValue" |;
+ }
+ $atValue = $self->{'_attributes'}->{'standalone'};
+ if (defined $atValue)
+ {
+ $attribString .= qq|standalone="$atValue" |;
+ }
+
foreach my $atName (sort keys %{$self->{'_attributes'}})
{
- $attribString .= qq|$atName="$self->{'_attributes'}->{$atName}" |;
- }
+ if (($atName ne 'version') && ($atName ne 'encoding') && ($atName ne
'standalone'))
+ {
+ $attribString .= qq|$atName="$self->{'_attributes'}->{$atName}" |;
+ }
+ }
+
if (defined $attribString && $attribString =~ m|\S|)
{
$retString .= $attribString;