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