Search code examples
vb.netxmlwriter

VB.NET XMLWriter: How to change what's in the header?


I have a requirement to make an XML file - and the partner is rather sticky about the header. Apparently, the header must be exactly this:

<?xml version="1.0"?>

But whenever I create an XML file I get extraneous properties like this:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

The hacker in me wants to stop using XMLWriter to make the file so that I have more control over the header; "no problem, I'll just write a loop that makes its own XML tags as a StreamWriter or something, forget this XMLWriter object..." but I must admit that XMLWriter has been rather elegant to use so far; surely there must be something where I can change the XMLWriterSettings object to say "stop putting your custom properties in to the XML header please", right?

Here's the relevant VB code:

    Dim settings As New XmlWriterSettings()
    settings.Indent = True
    settings.IndentChars = "    "
    settings.NewLineChars = "\n"
    Using writer As XmlWriter = XmlWriter.Create(strFileName, settings)
            writer.WriteStartDocument(True)
            For Each kvp As KeyValuePair(Of String, String) In dictArguments

                 Dim key As String = kvp.Key
                 Dim value As String = kvp.Value

                 writer.WriteStartElement(key)
                 writer.WriteString(value)
                 writer.WriteEndElement()

            Next

    End Using

Works perfectly; but I can't find a way to control the header. I can find a way to remove it entirely of course but that's not what we want to do.

Edit: thanks for the help; so far once we removed the WriteStartDocument it now no longer displays standalone = yes. I can't get it to stop adding the encoding however. Any ideas?


Solution

  • One way of doing this is to take control of the initial processing instruction yourself with the WriteProcessingInstruction method thus:

        Dim settings As New XmlWriterSettings()
        settings.Indent = True
        settings.IndentChars = "    "
        Using writer As XmlWriter = XmlWriter.Create(strFileName, settings)
            writer.WriteProcessingInstruction("xml", "version='1.0'")
            writer.WriteStartElement("root")
            For Each kvp As KeyValuePair(Of String, String) In dictArguments
    
                Dim key As String = kvp.Key
                Dim value As String = kvp.Value
    
                writer.WriteStartElement(key)
                writer.WriteString(value)
                writer.WriteEndElement()
    
            Next
            writer.WriteEndElement()
    
        End Using
    

    Note that I've also added a "root" element in case your dictionary contains more than one element (and I'm guessing that none of the dictionary key values is "root" :)