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


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

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

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

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

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

2   51   2010-02-26 09:01:56

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.

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

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

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

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