[prev in list] [next in list] [prev in thread] [next in thread] 

List:       koffice-devel
Subject:    [Qt-4.2] QDomDocument writes out xmlns:prefix=namespaceuri for every
From:       David Faure <faure () kde ! org>
Date:       2006-11-07 20:49:23
Message-ID: 200611072149.25442.faure () kde ! org
[Download RAW message or body]

Loading an XML document with QDomDocument and namespace processing enabled (*) works,
but saving it back gives a bloated and redundant XML file with "xmlns:prefix=namespaceuri" \
added to each and every element.

<?xml version='1.0' encoding='UTF-8'?>
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0">
 <office:font-face-decls xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0">
  <style:font-face xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" \
svg:font-family="Bitstream Vera Sans" \
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" style:name="Bitstream Vera \
Sans" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" />  <style:font-face \
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" svg:font-family="DejaVu Sans" \
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" style:name="DejaVu Sans" \
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" />  </office:font-face-decls>
  [...]

Redefining xmlns:office in every element other than the toplevel office:document-content is \
unnecessary since the definition in an element is applicable to any child element. The initial \
XML document simply defined all the namespaces in the <office:document-content> element.

Even worse, the <style:font-face> elements got xmlns:style defined twice.
Checking the validity of this document with jing and a relaxng schema shows that as an error:
content.xml:4:234: fatal: Attribute "xmlns:style" was already specified for element \
"style:font-face".

The initial document was
<?xml version="1.0" encoding="UTF-8"?>
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" \
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0">  <office:font-face-decls>
    <style:font-face style:name="Bitstream Vera Sans" svg:font-family="Bitstream Vera Sans"/>
    <style:font-face style:name="DejaVu Sans" svg:font-family="DejaVu Sans"/>
  </office:font-face-decls>
  [...]

QDomElementPrivate::save() has a TODO comment about this.
To "only declare namespaces that are not yet declared" should indeed be implemented.


(*)
    QXmlInputSource source( inputDevice );
    QXmlSimpleReader reader;
    reader.setFeature( "http://xml.org/sax/features/namespaces", true )
    reader.setFeature( "http://xml.org/sax/features/namespace-prefixes", false );
    QString errorMsg;
    int errorLine, errorColumn;
    bool ok = doc.setContent( &source, &reader, &errorMsg, &errorLine, &errorColumn );

    Then using doc.toByteArray() when saving.

-- 
David Faure, faure@kde.org, sponsored by Trolltech to work on KDE,
Konqueror (http://www.konqueror.org), and KOffice (http://www.koffice.org).
_______________________________________________
koffice-devel mailing list
koffice-devel@kde.org
https://mail.kde.org/mailman/listinfo/koffice-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic