Префиксы XML-сериализации и пространства имен
Я ищу способ с С#, который я могу сериализовать класс в XML и добавить пространство имен, но определить префикс, который будет использовать это пространство имен.
В конечном итоге я пытаюсь создать следующий XML:
<myNamespace:Node xmlns:myNamespace="...">
<childNode>something in here</childNode>
</myNamespace:Node>
Я знаю как с DataContractSerializer
, так и с XmlSerializer
, я могу добавить пространство имен, но они, похоже, создают префикс внутри, с чем-то, что я не могу контролировать. Могу ли я контролировать его с помощью любого из этих сериализаторов (я могу использовать любой из них)?
Если я не могу управлять генерацией пространств имен, мне нужно будет написать собственный XML-сериализатор, и если да, то какой из них лучше написать?
Ответы
Ответ 1
Чтобы управлять псевдонимом пространства имен, используйте 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
.
Ответ 2
При использовании сгенерированного кода из схемы, где типы имеют пространства имен, это переопределение пространства имен применяется на корневом уровне, но теги внутри разных типов будут иметь пространство имен, связанное с классом.
Мне приходилось использовать два разных сгенерированных класса, но с разными именами, на которых я разговаривал (не спрашивайте, не под моим контролем).
Я попробовал все предложенные здесь переопределения и, наконец, сдался и использовал своего рода метод грубой силы, который действительно работал очень хорошо. То, что я сделал, было сериализовано для строки. Затем используйте string.replace для изменения пространств имен, а затем отправили поток из строки с помощью stringwriter. То же самое в ответе - захват в строку - манипулирует пространством имен, а затем десериализует строку из записи строки.
Он может быть не изящным или использовать все причудливые переопределения, но он выполнил свою работу.