Префиксы XML-сериализации и пространства имен

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

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

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

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

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

Ответы

Ответ 1

Чтобы управлять псевдонимом пространства имен, используйте 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.

Ответ 2

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

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

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

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