Префиксы сериализации 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. То же самое в ответе - захват строки - манипулируйте пространством имен, а затем десериализуйте строку из записи строк.
Это может быть не элегантно или использовать все причудливые переопределения, но он выполнил свою работу.