【问题标题】:How to specify multiple namespaces in DataContract attribute如何在 DataContract 属性中指定多个命名空间
【发布时间】:2015-08-20 17:04:47
【问题描述】:

给定一个业务对象“Order”,我如何实现 DataContract 属性,以便 Order 对象序列化为:

<Order xmlns="http://schemas.datacontract.org/2004/07/appulsive.MyCompany.SomeWebService"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
...etc.
</Order>

似乎有一个默认命名空间以及一个特定命名空间。我被告知这是使用相关 Web 服务的要求。

TIA。

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    假设你使用DataContractSerializer,你只需要在类中添加[DataContract(Name="desired name", Namespace="desired namespace")]

    [DataContract(Name = "Order", Namespace = "http://schemas.datacontract.org/2004/07/appulsive.MyCompany.SomeWebService")]
    public class Order
    {
        /// Various data members
        [DataMember]
        public string SomeStuff { get; set; }
    }
    

    这样做后,您还需要使用[DataMember] 标记您希望序列化的所有属性,因为数据协定序列化是可选的。那么DataContractSerializer生成的XML会是这样的:

    <Order xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/appulsive.MyCompany.SomeWebService">
        <SomeStuff>some stuff</SomeStuff>
    </Order>
    

    如您所见,命名空间"http://www.w3.org/2001/XMLSchema-instance" 已自动包含在内。这是因为它是一个standard namespace,其中包含标准属性的定义,包括nil(表示空值)和type(保存多态类型的类型信息)。由于这些属性几乎总是必需的,因此通常会将命名空间添加到根元素,事实上DataContractSerializer 就是这样做的。

    【讨论】:

    • 好的,所以我不需要指定默认命名空间,只需要指定一个,以便将两者都包含在 XML 中?对吗?
    • @NeilHaughton - 您需要指定Order 所在的命名空间,这将成为默认命名空间。 i:... 命名空间是自动包含的标准命名空间。
    猜你喜欢
    • 2014-11-20
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多