XML сериализация в C# без узлов атрибутов XML



У меня есть формат XML-документа из устаревшей системы, который я должен поддерживать в будущем приложении. Однако я хочу иметь возможность сериализовать и десериализовать XML между объектами XML и C#, используя объекты, созданные xsd.exe, сериализация C# включает в себя xmlns:xsi..., xsi:... атрибуты XML etc в корневом элементе документа, который генерируется. Можно ли вообще отключить это, чтобы в результирующем XML-файле не было абсолютно никаких узлов атрибутов XML ? формат XML документ должен содержать только элементы.





Дубликат? XmlSerializer: удаление ненужных пространств имен xsi и xsd

728   2  

2 ответов:

Да, используйте класс XmlSerializerNamespaces.

Пример:

  var s= new System.Xml.Serialization.XmlSerializer(typeof(TypeToSerialize));
  var ns= new System.Xml.Serialization.XmlSerializerNamespaces();
  ns.Add( "", "");
  System.IO.StreamWriter writer= System.IO.File.CreateText(filePath);
  s.Serialize(writer, objectToSerialize, ns);
  writer.Close();

Смотрите также: XmlSerializer: удаление ненужных пространств имен xsi и xsd

Невозможно заставить XML-сериализатор игнорировать атрибуты xsi (если только вы не реализуетеIXmlSerializable и не принудите пользовательскую сериализацию или не используетеXmlAttributeOverrides ). Однако атрибуты xsi: появляются только тогда, когда у вас есть элемент, допускающий значение null. Если вам нужно использовать nullable элементы, вы можете, конечно, после обработки XML удалить все xsi: occurences. Однако если вы делаете это, думаете о том, как вы десериализовать XML обратно в объект, если xsi:nil это отсутствует на элементе, а элемент определен как целое число, допускающее значение null, вы столкнетесь с исключением.

Чизо, пожалуйста, поправь меня, если я ошибаюсь.

У меня есть следующий код.

  public class TestSer
    {
        public int? MyProperty { get; set; }   
    }





    TestSer ser = new TestSer();
    ser.MyProperty = null;

    StringBuilder bldr = new StringBuilder();
    var ns = new System.Xml.Serialization.XmlSerializerNamespaces();
    ns.Add("", "");
    XmlSerializer s = new XmlSerializer(typeof(TestSer));
    using (StringWriter writer = new StringWriter(bldr))
    {
        s.Serialize(writer, ser, ns);
    }

Я получаю следующий результат.

<?xml version="1.0" encoding="utf-16"?>
<TestSer>
  <MyProperty d2p1:nil="true" xmlns:d2p1="http://www.w3.org/2001/XMLSchema-instance" />
</TestSer>

Это не совсем элемент, только как требует вопрос.

Comments

    Ничего не найдено.