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

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

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

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

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

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

2 ответов


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


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

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

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

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