Префикс XML-сериализации и пространства имен - PullRequest
55 голосов
/ 26 февраля 2010

Я ищу способ с C #, чтобы я мог сериализовать класс в XML и добавить пространство имен, но определить префикс, который будет использовать это пространство имен.

В конечном итоге я пытаюсь сгенерировать следующий XML:

<myNamespace:Node xmlns:myNamespace="...">
  <childNode>something in here</childNode>
</myNamespace:Node>

Я знаю, что и с DataContractSerializer, и с XmlSerializer я могу добавить пространство имен, но они, похоже, генерируют префикс внутри, с чем-то, что я не могу контролировать. Могу ли я управлять этим с любым из этих сериализаторов (я могу использовать любой из них)?

Если я не смогу управлять генерацией пространств имен, нужно ли мне писать свой собственный сериализатор XML, и если да, то для чего лучше всего его написать?

Ответы [ 2 ]

100 голосов
/ 26 февраля 2010

Для управления псевдонимом пространства имен используйте XmlSerializerNamespaces.

[XmlRoot("Node", Namespace="http://flibble")]
public class MyType {
    [XmlElement("childNode")]
    public string Value { get; set; }
}

static class Program
{
    static void Main()
    {
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("myNamespace", "http://flibble");
        XmlSerializer xser = new XmlSerializer(typeof(MyType));
        xser.Serialize(Console.Out, new MyType(), ns);
    }
}

Если вам нужно изменить пространство имен во время выполнения, вы можете дополнительно использовать XmlAttributeOverrides.

3 голосов
/ 28 февраля 2014

При использовании сгенерированного кода из схемы, где типы имеют пространства имен, это переопределение пространства имен применяется на корневом уровне, но теги в пределах различных типов будут иметь пространство имен, связанное с классом.

У меня была возможностьнужно использовать два разных сгенерированных класса, но иметь разные пространства имен в зависимости от того, с каким сервером я общался (не спрашивайте, не под моим контролем).

Я перепробовал все предложенные здесь переопределения и, наконец, сдался и использовал некий метод грубой силы, который на самом деле работал довольно хорошо.Я сделал сериализацию в строку.Затем используйте string.replace для изменения пространств имен, затем разместите поток из строки с помощью stringwriter.То же самое в ответе - захват в строку - манипулирование пространством имен и десериализация строки из строкового редактора.

Это может быть не элегантно или использовать все причудливые переопределения, но оно выполнило свою работу.

...