Префикс 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")]