Как сериализовать объект в XML без получения xmlns = “…”?

Есть ли способ для меня сериализовать объект в .NET без пространства имен XML также автоматически сериализуется? Похоже, что по умолчанию .NET считает, что пространства имен XSI и XSD должны быть включены, но я не хочу их там.

5 Solutions collect form web for “Как сериализовать объект в XML без получения xmlns = “…”?”

Ах … неважно. Это всегда поиск после постановки вопроса, который дает ответ. Мой объект, который сериализуется, является obj и уже определен. Добавление XMLSerializerNamespace с единственным пустым пространством имен в коллекцию делает трюк.

В VB вот так:

 Dim xs As New XmlSerializer(GetType(cEmploymentDetail)) Dim ns As New XmlSerializerNamespaces() ns.Add("", "") Dim settings As New XmlWriterSettings() settings.OmitXmlDeclaration = True Using ms As New MemoryStream(), _ sw As XmlWriter = XmlWriter.Create(ms, settings), _ sr As New StreamReader(ms) xs.Serialize(sw, obj, ns) ms.Position = 0 Console.WriteLine(sr.ReadToEnd()) End Using 

в C #:

 //Create our own namespaces for the output XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); //Add an empty namespace and empty value ns.Add("", ""); //Create the serializer XmlSerializer slz = new XmlSerializer(someType); //Serialize the object with our own namespaces (notice the overload) slz.Serialize(myXmlTextWriter, someObject, ns); 

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

 // Add lib namespace with empty prefix ns.Add("", "http://schemas.YourCompany.com/YourSchema/"); 

Я предлагаю этот вспомогательный class:

 public static class Xml { #region Fields private static readonly XmlWriterSettings WriterSettings = new XmlWriterSettings {OmitXmlDeclaration = true, Indent = true}; private static readonly XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")}); #endregion #region Methods public static string Serialize(object obj) { if (obj == null) { return null; } return DoSerialize(obj); } private static string DoSerialize(object obj) { using (var ms = new MemoryStream()) using (var writer = XmlWriter.Create(ms, WriterSettings)) { var serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(writer, obj, Namespaces); return Encoding.UTF8.GetString(ms.ToArray()); } } public static T Deserialize(string data) where T : class { if (string.IsNullOrEmpty(data)) { return null; } return DoDeserialize(data); } private static T DoDeserialize(string data) where T : class { using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(data))) { var serializer = new XmlSerializer(typeof (T)); return (T) serializer.Deserialize(ms); } } #endregion } 

🙂

Если вы хотите удалить пространство имен, вы также можете удалить версию, чтобы сохранить поиск. Я добавил эту функциональность, чтобы нижний код выполнял оба.

Я также обернул его в общий метод, так как я создаю очень большие XML-файлы, которые слишком велики для сериализации в памяти, поэтому я сломал свой выходной файл и сериализую его в меньших «кусках»:

  public static string XmlSerialize(T entity) where T : class { // removes version XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; XmlSerializer xsSubmit = new XmlSerializer(typeof(T)); using (StringWriter sw = new StringWriter()) using (XmlWriter writer = XmlWriter.Create(sw, settings)) { // removes namespace var xmlns = new XmlSerializerNamespaces(); xmlns.Add(string.Empty, string.Empty); xsSubmit.Serialize(writer, entity, xmlns); return sw.ToString(); // Your XML } } 

Если вы не можете избавиться от дополнительных атрибутов xmlns для каждого элемента, при сериализации в xml из сгенерированных classов (например: при использовании xsd.exe ), значит, у вас есть что-то вроде:

  

то я бы поделился с вами тем, что сработало для меня (сочетание предыдущих ответов и того, что я нашел здесь )

явно задали все ваши xmlns следующим образом:

 Dim xmlns = New XmlSerializerNamespaces() xmlns.Add("one", "urn:names:specification:schema:xsd:one") xmlns.Add("two", "urn:names:specification:schema:xsd:two") xmlns.Add("three", "urn:names:specification:schema:xsd:three") 

затем передать его в сериализацию

 serializer.Serialize(writer, object, xmlns); 

у вас будут три пространства имен, объявленные в корневом элементе, и больше не нужно создавать в других элементах, которые будут иметь префикс соответственно

    ... 
  • XSLT: как преобразовать XML-узел в строку
  • Сериализация объекта как XML UTF-8 в .NET.
  • Сериализация Xml - Скрыть нулевые значения
  • Использование StringWriter для сериализации XML
  • Как вы сериализуете строку как CDATA с помощью XmlSerializer?
  • Сериализация растрового изображения в C # /. NET для XML
  • Почему classу XML-Serializable нужен конструктор без параметров
  • Как узнать, когда вы загрузились через XML-сериализацию?
  • Почему свойства без сеттера не сериализованы
  • Опускание всех пространств имен xsi и xsd при сериализации объекта в .NET?
  • Правильный способ реализации IXmlSerializable?
  • Interesting Posts

    Как разбить числа на столбцы с отрицательными и положительными значениями, без пустых ячеек?

    Каково использование интерфейсных констант?

    Как получить диаграмму в Excel, чтобы автоматически добавлять новые серии данных?

    MySQL SELECT LIKE или REGEXP для сопоставления нескольких слов в одной записи

    Лучший способ извлечь подвектор из вектора?

    Как загружается микрокод на процессор?

    Как обмануть HTTP-референт

    Проводник (рабочий стол) Остановка освежения

    Почему Google Chrome игнорирует свойство «last_known_google_url» в файле «Local State»?

    Пользовательский адаптер Listview с фильтром Android

    Вызов ASP.NET PageMethod / WebMethod с помощью jQuery – возвращает всю страницу

    Как восстановить данные на отформатированном жестком диске и уже установить новую ОС

    Помощь с передачей ArrayList и разумной активностью

    Создайте screencast с ffmpeg: как сохранить видео + аудио в синхронизации?

    KeyError: «TCL_Library», когда я использую cx_Freeze

    Давайте будем гением компьютера.