Search code examples
xmldommsxml

How to make XMLDOMDocument include the XML Declaration?


When an XMLDOMDocument saves itself, how can i get it to include the XML Declaration, e.g.:

  • <?xml version="1.0" encoding="UTF-8" ?>
  • <?xml version="1.0" encoding="UTF-16" ?>
  • <?xml version="1.0" encoding="UCS-2" ?>
  • <?xml version="1.0" encoding="UCS-4" ?>
  • <?xml version="1.0" encoding="ISO-10646-UCS-2" ?>
  • <?xml version="1.0" encoding="UNICODE-1-1-UTF-8" ?>
  • <?xml version="1.0" encoding="UNICODE-2-0-UTF-16" ?>
  • <?xml version="1.0" encoding="UNICODE-2-0-UTF-8" ?>
  • <?xml version="1.0" encoding="US-ASCII" ?>
  • <?xml version="1.0" encoding="ISO-8859-1" ?>
  • <?xml version="1.0" encoding="WINDOWS-1250" ?>

The XMLDOMDomcument object is being created in memory (i.e. the xml is not being loaded from some outside source):

{
   IXMLDOMDocument2 doc = new DOMDocument60();

   //add nodes to the doc
   ...

   doc.Save(saveTarget);
}

Without the xml declaration you only get the body xml, e.g.:

<Customer>
   ...
</Customer>

rather than the full XML document:

<?xml version="1.0" encoding="US-ASCII" ?>
<Customer>
   ...
</Customer>

Question 2

How can i control the encoding the XMLDOMDocument will use when it saves to a stream?


Solution

  • You need to use a MXXMLWriter60, instead of saving it directly. Sorry I don't have a C# example, but here is the VB.Net equivalent. See IMXWriter for details.

    ' Create and load a DOMDocument object.
    
    Dim xmlDoc As New DOMDocument60
    xmlDoc.loadXML("<doc><one>test1</one><two>test2</two></doc>")
    
    ' Set properties on the XML writer - including BOM, XML declaration and encoding
    
    Dim wrt As New MXXMLWriter60
    wrt.byteOrderMark = True
    wrt.omitXMLDeclaration = False
    wrt.encoding = "US-ASCII"
    wrt.indent = True
    
    ' Set the XML writer to the SAX content handler.
    
    Dim rdr As New SAXXMLReader60
    Set rdr.contentHandler = wrt
    Set rdr.dtdHandler = wrt
    Set rdr.errorHandler = wrt
    rdr.putProperty "http://xml.org/sax/properties/lexical-handler", wrt
    rdr.putProperty "http://xml.org/sax/properties/declaration-handler", wrt
    
    ' Now pass the DOM through the SAX handler, and it will call the writer
    
    rdr.parse xmlDoc
    
    ' Let the writer do its thing
    
    Dim iFileNo As Integer
    iFileNo = FreeFile
    Open App.Path + "\saved.xml" For Output As #iFileNo
    Print #iFileNo, wrt.output
    Close #iFileNo