Reputation: 4505
I am serializing an object using c#. I am getting result in this format given bellow
<?xml version="1.0"?>
<Users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Users>
<User Id="11005477969327" CreateDate="06/03/2011" LastSendDate="1/1/0001" />
<User Id="11034688201594" CreateDate="04/22/2012" LastSendDate="1/1/0001" />
<Users
</User>
But I want result in this format.
<?xml version="1.0"?>
<Users>
<User Id="11005477969327" SendDate="1/1/0001" NextSendDate="2/7/2012 11:13:30 AM" />
<User Id="11034688201594" SendDate="1/1/0001" NextSendDate="2/7/2012 11:13:30 AM" />
</Users>
Here's my code:
public class Users
{
[XmlArray("Users")]
public List<User> ListData { get; set; }
public string GetXML()
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
XmlSerializer sr = new XmlSerializer(typeof(Users));
sr.Serialize(ms, this);
ms.Position = 0;
return System.Text.Encoding.UTF8.GetString(ms.ToArray());
}
}
public class User
{
[XmlAttribute("Id")]
public Int64 UserId { get; set; }
[XmlAttribute("CreateDate")]
public string CreateDate { get; set; }
[XmlAttribute("LastSendDate")]
public string LastSendDate { get; set; }
}
Upvotes: 29
Views: 53739
Reputation: 4159
You should simply replace [XmlArray("Users")]
with [XmlElement("User")]
This attribute tell serializer, that you want to store all those User items under particular node "Users", if you replace it with XmlElement
, serialzer will store all those users inline (right under first Users tag) just as you like it.
As for xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
namespaces. They are added automatically, but they are harmless, since all your elements are in the default namespace. You may add following code to your XmlSerializer
call in order to remove those:
var xns = new XmlSerializerNamespaces();
var serializer = new XmlSerializer(users.GetType());
xns.Add(string.Empty, string.Empty);
//...
serializer.Serialize(stream, users, xns);
Upvotes: 81
Reputation: 433
You should write:
XmlSerializer sr = new XmlSerializer(typeof(Users));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
sr.Serialize(ms, this, ns);
Upvotes: 10
Reputation: 1
Quickie solution - convert to string and then remove thus - Uses a button click to start execution.
Imports System.IO
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim mydoc As XElement = XElement.Load("C:\Users\Documents\myfile.XML")
Dim y As String = mydoc.ToString
Dim z As String = mydoc.Name.Namespace.ToString
Dim getrid As String = " xmlns=" & Chr(34) & z & Chr(34)
y = Replace(y, getrid, "")
Dim tr As TextReader = New StringReader(y)
Dim newdoc As XElement = XElement.Load(tr)
tr.Close()
Debug.Print(newdoc.ToString)
End Sub
End Class
Upvotes: -10