简体   繁体   中英

xml serialization - remove namespace

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; }
}

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);

You should write:

XmlSerializer sr = new XmlSerializer(typeof(Users));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
sr.Serialize(ms, this, ns);

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM