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

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

Ах … неважно. Это всегда поиск после постановки вопроса, который дает ответ. Мой объект, который сериализуется, является 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); 

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

    ... 
  • Как вы сериализуете строку как CDATA с помощью XmlSerializer?
  • Могу ли я заставить JAXB не преобразовывать «в», например, при сортировке XML?
  • Как я сериализую значение enum как int?
  • .net XML Serialization - Сохранение ссылки вместо копирования объектов
  • Почему в .NET нет XML-сериализуемого словаря?
  • Исключение некоторых свойств во время сериализации без изменения исходного classа
  • Сериализация XML и унаследованные типы
  • {" не ожидалось.} Deserializing Twitter XML
  • Лучшее решение для XmlSerializer и System.Drawing.Color
  • Сериализация объекта как XML UTF-8 в .NET.
  • Как сопоставить объекты XML с C #
  • Давайте будем гением компьютера.