Как добавить пространство имен по умолчанию без префикса с помощью XMLSerializer

Я пытаюсь создать XML-документ, содержащий пространство имен по умолчанию без префикса, используя XmlSerializer, например.

<?xml version="1.0" encoding="utf-8" ?>
<MyRecord ID="9266" xmlns="http://www.website.com/MyRecord">
    <List>
        <SpecificItem>

Используя следующий код...

string xmlizedString = null;
MemoryStream memoryStream = new MemoryStream();
XmlSerializer xs = new XmlSerializer(typeof(ExportMyRecord));
XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces();
xmlnsEmpty.Add(string.Empty, string.Empty);
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
xs.Serialize(xmlTextWriter, myRecord, xmlnsEmpty);
memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
xmlizedString = this.UTF8ByteArrayToString(memoryStream.ToArray());

и классовая структура...

[Serializable]
[XmlRoot("MyRecord")]
public class ExportMyRecord
{
    [XmlAttribute("ID")]
    public int ID { get; set; }

Сейчас пробовал разные варианты...

XmlSerializer xs = new XmlSerializer
                     (typeof(ExportMyRecord),"http://www.website.com/MyRecord");

or ...

[XmlRoot(Namespace = "http://www.website.com/MyRecord", ElementName="MyRecord")]

дает мне ...

<?xml version="1.0" encoding="utf-8"?>
<q1:MylRecord ID="9266" xmlns:q1="http://www.website.com/MyRecord">
    <q1:List>
        <q1:SpecificItem>

Мне нужно, чтобы XML имел пространство имен без префикса, так как он передается стороннему поставщику, и они отвергают все другие альтернативы.


person OldBob    schedule 23.03.2010    source источник


Ответы (2)


Ну вот:

ExportMyRecord instance = GetInstanceToSerializeFromSomewhere();
XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces();
xmlnsEmpty.Add(string.Empty, "http://www.website.com/MyRecord");
var serializer = new XmlSerializer(
    instance.GetType(), 
    "http://www.website.com/MyRecord"
);
person Darin Dimitrov    schedule 26.03.2010
comment
просто хотел отметить, что вы не используете xmlnsEmpty и его можно опустить. Перегрузка сериализации, которая принимает XmlSerializerNamespaces, похоже, не использует значение string.empty. - person arviman; 22.01.2014
comment
Великолепно! также были проблемы с <q1:root xmlns:SomeAttr="urn" q1:SomeAttr="urn>, пока я не увидел это исправление. просто нужно было добавить дополнительное XmlSerializerNamespace, чтобы мое решение работало - person Eon; 22.07.2014
comment
xmlnsEmpty используется во время сериализации: serializer.Serialize(xmlTextWriter, myRecord, xmlnsEmpty); - person Jamie Ide; 22.04.2015

Вот общая реализация, которую можно использовать для любого типа:

public static void Serialize<T>(T instance, string defaultNamespace, Stream stream)
{
    var namespaces = new XmlSerializerNamespaces();
    namespaces.Add(string.Empty, defaultNamespace);
    var serializer = new XmlSerializer(typeof(T), defaultNamespace);
    serializer.Serialize(stream, instance, namespaces);
}
person Sven Vranckx    schedule 31.01.2019