简体   繁体   English

ASP.NET Core API 空 XML 对象

[英]ASP.NET Core API empty XML object

I have a controller which contains POST method that have to receive an XML object and deserialize it.我有一个包含 POST 方法的控制器,该方法必须接收一个 XML 对象并将其反序列化。 But after all my attempts I am always getting an empty object with all properties set to nulls or defaults.但在我所有的尝试之后,我总是得到一个空对象,所有属性都设置为空值或默认值。

Here is the code (sorry for this heap, but I think the mistake could be in any piece of the code.):这是代码(对不起这个堆,但我认为错误可能出现在任何一段代码中。):

Order class:订单类:

[XmlRoot]
public class Order
{
    [XmlElement]
    public long OrderSource { get; set; }

    [XmlElement]
    public long Type { get; set; }

    [XmlElement]
    public decimal DiscountPercent { get; set; }

    [XmlElement]
    public string PayMethod { get; set; }

    [XmlElement]
    public int QtyPerson { get; set; }

    [XmlElement]
    public decimal ChangeAmount { get; set; }

    [XmlElement]
    public string Remark { get; set; }

    [XmlElement]
    public Customer Customer { get; set; }

    [XmlElement]
    public Address Address { get; set; }

    [XmlElement]
    public string AddressRemark { get; set; }

    [XmlElement]
    public Phone Phone { get; set; }

    [XmlArray(nameof(Products))]
    public List<Product> Products { get; set; }

Customer class:客户类别:

[XmlRoot]
public class Customer
{
    [XmlElement]
    public string Name { get; set; }
}

Address class:地址类:

[XmlRoot]
public class Address
{
    [XmlElement]
    public string CityName { get; set; }

    [XmlElement]
    public string StreetName { get; set; }

    [XmlElement]
    public string House { get; set; }

    [XmlElement]
    public string Flat { get; set; }

    [XmlElement]
    public string Floor { get; set; }

    [XmlElement]
    public string DoorCode { get; set; }
}

And the Phone class:和电话类:

[XmlRoot]
public class Phone
{
    [XmlElement]
    public string Number { get; set; }
}

And here is the body of the request:这是请求的正文:

<?xml version="1.0" encoding="UTF-8"?>
<Order>
    <orderSource>0</orderSource>
    <type>0</type>
    <discountPercent>0</discountPercent>
    <payMethod>string</payMethod>
    <qtyPerson>0</qtyPerson>
    <changeAmount>0</changeAmount>
    <remark>string</remark>
    <customer>
        <name>asdasd</name>
    </customer>
    <address>
        <cityName>string</cityName>
        <streetName>string</streetName>
        <house>string</house>
        <flat>string</flat>
        <floor>string</floor>
        <doorCode>string</doorCode>
    </address>
    <addressRemark>string</addressRemark>
    <phone>
        <number>string</number>
    </phone>
    <products>
        <name>string</name>
        <code>string</code>
        <qty>0</qty>
        <price>0</price>
    </products>
</Order>

Tell me please, what should I change here, so the built-in deserializer could properly process the request?请告诉我,我应该在这里更改什么,以便内置解串器可以正确处理请求? Thanks in advance提前致谢

Your problem is that the case of your XML elements does not match the XML.您的问题是您的 XML 元素的大小写与 XML 不匹配。 Your properties are pascal cased but the XML is camel cased.您的属性是 pascal 大小写的,但 XML 是骆驼大小写的。 And, unfortunately, XML is case-sensitive.而且,不幸的是,XML 区分大小写。 See: Is XML case-sensitive?请参阅: XML 是否区分大小写? (answer: yes) and Case insensitive XML parser in c# . (答案:是)和c# 中不区分大小写的 XML 解析器

You need to fix your property names or override them by setting setting XmlElementAttribute.ElementName as shown in this answer to XML Deserialization doesn't work with abstract class , ie:您需要修复您的属性名称或通过设置XmlElementAttribute.ElementName来覆盖它们,如XML Deserialization 的答案中所示,不适用于抽象类,即:

public class Order
{
    [XmlElement("orderSource")]
    public long OrderSource { get; set; }

    // And similarly for all remaining properties

Or或者

public class Order
{
    public long orderSource { get; set; }

    // And similarly for all remaining properties

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM