使用XmlSerializer添加没有前缀的命名空间

时间:2009-12-07 16:20:08

标签: c# xml-serialization

我希望我的输出看起来像这样

<OrderContainer xmlns="http://blabla/api/products" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

所以我将以下内容添加到我的XmlSerializer

XmlSerializer x = new XmlSerializer(typeof(OrderContainer));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "http://blabla/api/products");
ns.Add("i", "http://www.w3.org/2001/XMLSchema-instance");
// do stuff..
x.Serialize(stream, orderContainer, ns);

但现在我得到了

<OrderContainer xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

那么如何编辑默认命名空间?


我的对象定义如下:

[System.Runtime.Serialization.DataContractAttribute(Name="OrderContainer", Namespace="http://blabla/api/products")]
[System.SerializableAttribute()]
public partial class OrderContainer

3 个答案:

答案 0 :(得分:10)

您可以使用XmlSerializer constructor除了要序列化的类型之外还使用默认命名空间:

var x = new XmlSerializer(
    typeof(OrderContainer), 
    "http://blabla/api/products");
var ns = new XmlSerializerNamespaces();
ns.Add("i", "http://www.w3.org/2001/XMLSchema-instance");
x.Serialize(stream, orderContainer, ns);

答案 1 :(得分:2)

如果您希望使用XML序列化程序,则必须使用[XmlElementAttribute],而不是[DataContractAttribute]

答案 2 :(得分:0)

啊,必须使用DataContractSerializer,它会自动生成正确的XML,包括命名空间。

DataContractSerializer dcs = new DataContractSerializer(typeof(OrderContainer));
//do stuff..
dcs.WriteObject(s, orderContainer);