我被要求从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>

我在Google周围搜索并尝试了各种修复程序,但均无济于事,我的模型看起来像
[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

我知道这是一个不好的问题,因为这无关紧要,但是我的客户正在讨价还价。

最佳答案

如果您需要XML看起来完全像某样东西,那么使用XmlSerializer可能会更好。 DataContractSerializer不能像您假定在两端使用它一样,给您相同级别的控制。

就是说,我可以想象您的使用方在“讨价还价”,因为这两个实例在语义上是不同的。第一个具有空的默认 namespace ,第二个具有默认 namespace 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>

关于c# - 删除xmlns :i and xmlns from webapi,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40364359/

10-11 16:05