Префикс 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.replace для изменения пространств имен, затем разместите поток из строки с помощью stringwriter. То же самое в ответе - захват в строку - манипулировать пространством имен и десериализовать строку из строкового редактора.

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

Я пришел сюда из другой ветки, которая кажется "дублированной", но не на мой взгляд.

Я ответил там, но не совсем понятно, поэтому позвольте мне ответить здесь еще раз.

если ваша цель - сделать что-то вроде:

<sample xmlns:sample="urn:sample:ns"> 
    <something>value<something>
    <sample:somethingelse>value2</sample:somethingelse>
    <new_root xmlns:newns="url:new:ns">
        <newns:item1>sample1</newns:item1> 
    </new_root>
</sample>

Я нашел для вас решение:).

Что вам нужно сделать, так это добавить в класс "new_root" объявление пространства имен, подобное этому.

[XmlNamespaceDeclarations] 
public XmlSerializerNamespaces newns;

и в вашем классе item1 добавьте следующее украшение, чтобы использовать ваше пространство имен

[XmlElement("item1", Namespace = "url:new:ns")]
Другие вопросы по тегам