Есть ли способ сериализации объекта в .NET без автоматической сериализации пространств имен XML? Кажется, что по умолчанию .NET считает, что пространства имен XSI и XSD должны быть включены, но я не хочу, чтобы они там были.
109
Есть ли способ сериализации объекта в .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);
q1
дерьма?Если вы хотите избавиться от лишнего
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
иxmlns:xsd="http://www.w3.org/2001/XMLSchema"
, но при этом сохранить собственное пространство именxmlns="http://schemas.YourCompany.com/YourSchema/"
, используйте тот же код, что и выше, за исключением этого простого изменения:источник
Если вы хотите удалить пространство имен, вы также можете удалить версию, чтобы сэкономить на поиске, я добавил эту функцию, поэтому приведенный ниже код будет делать и то, и другое.
Я также обернул его в универсальный метод, поскольку я создаю очень большие XML-файлы, которые слишком велики для сериализации в памяти, поэтому я разбил свой выходной файл и сериализовал его на более мелкие «куски»:
источник
StringWriter
умолчанию используется кодировка UTF-16, что может привести к проблемам с десериализацией в дальнейшем.using (var reader = XmlReader.Create(stream)){ reader.Read(); }
Это вызывает исключение, потому что в объявлении указано, что это UTF-16, в то время как содержимое фактически было записано как UTF-8.System.Xml.XmlException: 'There is no Unicode byte order mark. Cannot switch to Unicode.'
XmlReader
, вы можете использоватьvar streamReader = new StreamReader(stream, System.Text.Encoding.UTF8, true);
True будет использовать спецификацию, если она найдена, иначе значение по умолчанию, которое вы предоставите.Предлагаю этот вспомогательный класс:
:)
источник
new XmlSerializerNamespaces(new[] {XmlQualifiedName.Empty})
вместоnew XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")})
- это намеренно более четкий способ кодирования.Если вы не можете избавиться от лишних атрибутов xmlns для каждого элемента при сериализации в xml из сгенерированных классов (например, когда использовался xsd.exe ), у вас есть что-то вроде:
тогда я бы поделился с вами, что сработало для меня (смесь предыдущих ответов и того, что я нашел здесь )
явно установите все ваши XML-файлы следующим образом:
затем передайте его в сериализацию
у вас будет три пространства имен, объявленных в корневом элементе, и больше не нужно будет создавать в других элементах, которые будут иметь соответствующий префикс
источник
источник