Подтвердить что ты не робот

XML-сериализация - удаление пространства имен

Я сериализую объект с помощью С#. Я получаю результат в этом формате, приведенном ниже.

  <?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>

Но я хочу получить результат в этом формате.

<?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>

здесь мой код

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


    }
4b9b3361

Ответ 1

Вы должны просто заменить [XmlArray("Users")] на [XmlElement("User")]

Этот атрибут говорит сериализатору, что вы хотите хранить все эти элементы пользователя под определенным node "Пользователи", если вы замените его на XmlElement, serialzer сохранит всех этих пользователей inline (прямо под тегом первых пользователей) только как вам нравится.

Что касается xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" пространств имен. Они добавляются автоматически, но они безвредны, поскольку все ваши элементы находятся в пространстве имен по умолчанию. Вы можете добавить следующий код в свой вызов XmlSerializer, чтобы удалить его:

var xns = new XmlSerializerNamespaces();
var serializer = new XmlSerializer(users.GetType());
xns.Add(string.Empty, string.Empty);
//...
serializer.Serialize(stream, users, xns);

Ответ 2

Вы должны написать:

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

Ответ 3

Решение Quickie - преобразование в строку, а затем удаление - Используется кнопка для запуска выполнения.

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