Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I control the <?xml ?> part of xml serialization with .NET?

I am using this method to serialize my object:

public static string XmlSerialize(object o)
{
    var stringWriter = new StringWriter();
    var xmlSerializer = new XmlSerializer(o.GetType());
    xmlSerializer.Serialize(stringWriter, o);
    string xml = stringWriter.ToString();
    stringWriter.Close();
    return xml;
}

It makes XML that starts like this:

<?xml version="1.0" encoding="utf-16"?>
<MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

But I want it to look like this:

<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
<MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

So, how do I change the encoding to Windows-1252 and set standalone = yes? Additionally, how to I get the object to exclude the xmlns value?

I've seen a couple similar questions, like this one, but I was hoping it might be simpler for me, maybe by setting some attributes somewhere?

Update 2: After looking at John's answer and comments, and thinking about this more, I decided to just make a second method. I don't think that creating this wacky custom xml just for a 3rd party on one occasion should be called something as generic as "XmlSerialize" in the first place.

So, I created a second method that takes an XML document and first, removes the one namespace element like this:

xElement.Attributes().Where(a => a.IsNamespaceDeclaration && a.Value == "http://www.w3.org/2001/XMLSchema").Remove();

then, it it writes it to XML with John's code. Finally it returns that xml, following the output from this:

new XDeclaration("1.0", "Windows-1252", "yes").ToString()

And that's ugly, but it gets me exactly what I need for this 3rd party to understand my XML.

like image 368
Chris Avatar asked Sep 15 '09 21:09

Chris


People also ask

What is the correct way of using XML serialization?

As with the CreatePo method, you must first construct an XmlSerializer, passing the type of class to be deserialized to the constructor. Also, a FileStream is required to read the XML document. To deserialize the objects, call the Deserialize method with the FileStream as an argument.

Which annotation is needed for serialization and deserialization of XML format?

Jackson annotations are useful in defining and controlling the process of serialization and deserialization across various formats such as XML, JSON, and YAML. Some annotations work for all formats and some are tied to a specific type of file.

Which of the following attribute controls XML serialization of the attribute target as an XML root element?

XmlRootAttribute Class (System. Xml. Serialization) Controls XML serialization of the attribute target as an XML root element.

What is XML serialization in VB net?

The process of transforming the contents of an object into XML format is called serialization, and the reverse process of transforming an XML document into a . NET object is called deserialization. Page 2. An example. Let us take a C# class shown below (it could be VB.NET or any other .NET language for.


2 Answers

Try this:

public static string XmlSerialize(object o)
{
    using (var stringWriter = new StringWriter())
    {
        var settings = new XmlWriterSettings
                           {
                               Encoding = Encoding.GetEncoding(1252),
                               OmitXmlDeclaration = true
                           };
        using (var writer = XmlWriter.Create(stringWriter, settings))
        {
            var xmlSerializer = new XmlSerializer(o.GetType());
            xmlSerializer.Serialize(writer, o);
        }
        return stringWriter.ToString();
    }
}

This won't get rid of the xsd: namespace, but then, why do you want to?


Update: It seems that whenever you use a StringWriter, you get UTF-16, even if you use an XmlWriter on top of it with encoding set. Next step would be to write out to a MemoryStream. But that raises the question of why you want to return a string. For instance, if you're going to just turn around and output the string to a stream, then we should output directly to this stream. Same for a TextWriter.

like image 133
John Saunders Avatar answered Sep 19 '22 11:09

John Saunders


You can use an XmlTextWriter instead of a StringWriter. Here is an extract from some of my code with your encoding set.

XmlTextWriter textWriter = new XmlTextWriter(stream, Encoding.GetEncoding(1252));
textWriter.Namespaces = false;
like image 24
Ryall Avatar answered Sep 17 '22 11:09

Ryall