从webapi中删除xmlns:i和xmlns

时间:2016-11-01 16:31:40

标签: c# xml asp.net-web-api xml-deserialization

我被要求从http端点提供以下XML文档,完全如下: -

<?xml version="1.0" encoding="utf-8"?> 
  <XMLFile xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SalesOrders>
 ...
</SalesOrders>

然而,Web API吐出

<?xml version="1.0" encoding="utf-8"?>
<XMLFile xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://schemas.datacontract.org/2004/07/White.Label.Ordering.Infrastructure.Data.Queries.Export">
    <SalesOrders>
        ...
    </SalesOrders>

我已经谷歌并尝试了各种修复,但无济于事,我的模型看起来像

[DataContract]
public class XMLFile
{
    [DataMember]
    public List<SalesOrder> SalesOrders { get; set; }
}

[DataContract]
public class SalesOrder
{
    [DataMember(Order = 1)]
    public string OrderNumber { get; set; }
}

我的设置就像这样安慰

    public static void Register(HttpConfiguration config)
    {
        config.Formatters.XmlFormatter.WriterSettings.OmitXmlDeclaration = false;
        ...

    }

如何删除xmlns:ixmlns并替换为xmlns:xsdxmlns:xsi

我知道这是一个糟糕的问题,因为它不重要,但我的消费客户正在bar。

1 个答案:

答案 0 :(得分:2)

如果您需要XML看起来完全像某些东西,那么XmlSerializer可能会更好。 DataContractSerializer并没有为您提供相同级别的控制权,而是假设您在两端使用它。

那就是说,我想你的消费客户就是“扒手”。因为这两个实例在语义上是不同的。第一个具有空的默认命名空间,第二个具有默认命名空间http://schemas.datacontract.org/2004/07/White.Label.Ordering.Infrastructure.Data.Queries.Export

这应该是您需要纠正的唯一方法,您可以通过设置DataContract的命名空间来完成。

[DataContract(Namespace="")]
public class XMLFile
{
    [DataMember]
    public List<SalesOrder> SalesOrders { get; set; }
}

[DataContract(Namespace="")]
public class SalesOrder
{
    [DataMember(Order = 1)]
    public string OrderNumber { get; set; }
}

这会给你:

<?xml version="1.0" encoding="utf-8"?>
<XMLFile xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <SalesOrders>
        ...
    </SalesOrders>
</XMLFile>