XML序列化和命名空间前缀
我正在寻找一种C#方式,我可以将一个类序列化为XML并添加一个名称空间,但是定义该名称空间将使用的前缀。
最终,我试图生成以下的XML:
<myNamespace:Node xmlns:myNamespace="..."> <childNode>something in here</childNode> </myNamespace:Node>
我知道DataContractSerializer
和XmlSerializer
我都可以添加一个名称空间,但是他们似乎在内部生成了一个前缀,而我无法控制的东西。 我能够用这些序列化器(我可以使用其中之一)来控制它吗?
如果我无法控制名称空间的生成,那么我是否需要编写自己的XML序列化程序,如果是的话,编写它的最佳方法是什么?
要控制名称空间别名,请使用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
。
当从types具有名称空间的模式中使用生成的代码时,该名称空间覆盖适用于根级别,但不同types中的标签将具有与类相关联的名称空间。
我有一个场合需要使用两个不同的生成类,但基于我正在与哪个服务器交谈的名称空间不同(不要问我不能控制)。
我尝试了所有这里提供的覆盖,最后放弃了,并使用了一种实际上工作得很好的蛮力方法。 我所做的是序列化为一个string。 然后使用string.replace来更改命名空间,然后使用一个string打印机从string中发布stream。 相同的响应 – 捕获到一个string – 操纵命名空间,然后反序列化从string作家的string。
它可能不够优雅或使用所有的幻想覆盖,但它完成了工作。