Сериализация XML в C # без узлов атрибутов XML - PullRequest
2 голосов
/ 21 декабря 2009

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


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

Ответы [ 2 ]

7 голосов
/ 21 декабря 2009

Да, используйте класс 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

0 голосов
/ 21 декабря 2009

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

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

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

  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>

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

...