XML序列化和名称空间前缀

Aar*_*ell 58 c# xml-serialization datacontractserializer xmlserializer

我正在寻找一种使用C#的方法,我可以将类序列化为XML并添加命名空间,但是定义该命名空间将使用的前缀.

最终我正在尝试生成以下XML:

<myNamespace:Node xmlns:myNamespace="...">
  <childNode>something in here</childNode>
</myNamespace:Node>
Run Code Online (Sandbox Code Playgroud)

我知道有两个DataContractSerializerXmlSerializer我可以添加一个命名空间,但他们似乎在内部生成一个前缀,与我不能够控制的东西.我能用这些序列化器控制它(我可以使用其中任何一个)吗?

如果我无法控制名称空间的生成,我需要编写自己的XML序列化程序,如果是这样,那么编写它的最佳选择是什么?

Mar*_*ell 107

要控制命名空间别名,请使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要在运行时更改命名空间,可以另外使用XmlAttributeOverrides.

  • +1,但是我可以建议进行编辑,以明确.Add方法中的第一个参数是设置前缀的魔法所在的位置.在我检查MSDN文档之前,我不清楚答案. (4认同)
  • @ uzay95是的,这里有一个关于MSDN的例子:http://msdn.microsoft.com/en-us/library/dzxwk3ez(v = vs.110).aspx (2认同)

小智 5

当使用类型具有命名空间的模式生成的代码时,此命名空间覆盖适用于根级别,但不同类型中的标记将具有与类关联的命名空间。

我有机会需要使用两个不同的生成类,但根据我正在与之交谈的服务器具有不同的名称空间(不要问不受我控制)。

我尝试了这里提供的所有覆盖,最后放弃并使用了一种实际上效果很好的蛮力方法。我所做的是序列化为一个字符串。然后使用 string.replace 更改命名空间,然后使用 stringwriter 从字符串中发布流。响应相同 - 捕获到字符串 - 操作命名空间,然后从字符串编写器反序列化字符串。

它可能不优雅或使用所有花哨的覆盖,但它完成了工作。