Namecheap API: исключение для чтения XML в C#

У меня возникла проблема при десериализации XML:

[XmlRoot("ProductCategory")]
public class ProductCategory
{
    public Product[] Products;
}

public class Product
{
    [XmlArray("Product")]
    [XmlArrayItem("ProductPrice", typeof(ProductPrice))]
    public ProductPrice[] Prices;
}

public class ProductPrice
{
    [XmlAttribute]
    public int Duration;

    [XmlAttribute]
    public string DurationType;

    [XmlAttribute]
    public decimal Price;

    [XmlAttribute]
    public decimal RegularPrice;

    [XmlAttribute]
    public decimal YourPrice;

    [XmlAttribute]
    public string CouponPrice;

    [XmlAttribute]
    public string Currency;
}

и это действие:

public ProductType GetPricing()
        {
            XDocument doc = new Query(_params)
              .AddParameter("ProductType", "DOMAIN")
              .AddParameter("ActionName","REGISTER")
              .Execute("namecheap.users.getPricing");

            var serializer = new XmlSerializer(typeof(ProductType), _ns.NamespaceName);

            using (var reader = doc.Root.Element(_ns + "CommandResponse").Element(_ns + "ProductType").CreateReader())
            {
                return (ProductType)serializer.Deserialize(reader);
            }
        }

Я получаю эту ошибку: NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

И здесь вы можете найти пример XML: https://www.namecheap.com/support/api/methods/users/get-pricing.aspx

Есть идеи?

1 ответ

Решение

Найдено количество проблем с вашим кодом. Вот рабочий код

Сначала вы должны будете определить объекты, как показано ниже

[XmlRoot("ProductType", Namespace = "http://api.namecheap.com/xml.response")]
public class ProductType
{
    [XmlAttribute("Name")]
    public string Name { get; set; }

    [XmlElement("ProductCategory")]
    public ProductCategory[] ProductCategories;
}
public class ProductCategory
{
    [XmlElement("Product")]
    public Product[] Products;
}

public class Product
{
    [XmlElement("Price")]
    public ProductPrice[] Prices;
}

public class ProductPrice
{
    [XmlAttribute]
    public int Duration;

    [XmlAttribute]
    public string DurationType;

    [XmlAttribute]
    public decimal Price;

    [XmlAttribute]
    public decimal RegularPrice;

    [XmlAttribute]
    public decimal YourPrice;

    [XmlAttribute]
    public string CouponPrice;

    [XmlAttribute]
    public string Currency;
}

Вот код для десериализации

var serializerx = new XmlSerializer(typeof(ProductType), "http://api.namecheap.com/xml.response");
XElement doc = XElement.Load("sample1.xml");
XNamespace ns = doc.Name.Namespace;
var e = doc.Element(ns + "CommandResponse").Element(ns + "UserGetPricingResult").Element(ns + "ProductType");

using (var reader = e.CreateReader())
{
    var prod =  (ProductType)serializerx.Deserialize(reader);
}

Надеюсь это поможет

Другие вопросы по тегам