xml反序列化没有结果

问题描述 投票:0回答:2

我有这个xml

<products>
  <product>
    <name>Demo</name>
  </product>
  <product>
    <name>Black Beauty III</name>
    <description>Beautiful les paul guitar</description>
    <company>
      <name>Les Paul</name>
      <description>Very Good Company for guitar</description>
      <year>1967</year>
      <address>
        <houseno>Flat no-52</houseno>
        <street>Avishkar Appt. JVLR, Jogeshwari(E)</street>
        <city>Mumbai</city>
        <country>India</country>
        <pin>400060</pin>
      </address>
    </company>
    <grossprice>5700</grossprice>
    <netprice>6000</netprice>
    <measure>1 pc</measure>
    <category>4</category>
  </product>
  <product>
    <name></name>
    <description></description>
    <company>
      <name></name>
      <description></description>
      <year></year>
      <address>
        <houseno></houseno>
        <street></street>
        <city></city>
        <country></country>
        <pin></pin>
      </address>
    </company>
    <grossprice></grossprice>
    <netprice></netprice>
    <measure></measure>
    <category></category>
  </product>
</products>

通过使用此代码,我无法将其反序列化为对象

using (FileStream fs = new FileStream(System.IO.Path.Combine(System.Environment.CurrentDirectory + "/Products.xml"), FileMode.Open))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(Products));

                    var products = serializer.Deserialize(fs) as Products;
                }

我已经提到了类似

类中的所有 XML 元素和 XMLroot
[XmlType("products")]
[XmlInclude(typeof(Products))]
public class Products
{
    public Products() { }

    public Products(Boolean GetProducts) 
    {
        if (GetProducts)
            Items = GetAllProducts().Items;
    }

    [XmlElement("product")]
    public List<Product> Items { get; set; }

    public Products GetAllProducts()
    {
        try
        {
            Products allProducts = new Products();
            using (FileStream fs = new FileStream(System.IO.Path.Combine(System.Environment.CurrentDirectory + "/Products.xml"), FileMode.Open))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Products));

                var products = serializer.Deserialize(fs) as Products;
            }
            return allProducts;
        }
        catch (Exception ex) { return null; }
    }

    public Products GetAllProducts(ProductCategory Category)
    {
        return null;
    }
}

[XmlType("product")]
[XmlInclude(typeof(Product))]
public class Product
{
    [XmlElement("name")]
    String Name { get; set; }

    [XmlElement("description")]
    String Description { get; set; }

    [XmlElement("company")]
    Company Brand { get; set; }

    [XmlElement("grossprice")]
    String GrossPrice { get; set; }

    [XmlElement("netprice")]
    String NetPrice { get; set; }

    [XmlElement("measure")]
    String Measure { get; set; }

    [XmlElement("categoy")]
    ProductCategory Category { get; set; }

}

如果你愿意,我可以发布更多课程结构...

c# xml xml-serialization
2个回答
4
投票

我使用以下方法让它工作:

class Program
    {
        static void Main(string[] args)
        {
            using (FileStream fs = new FileStream("xml.xml", FileMode.Open))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Products));

                var products = serializer.Deserialize(fs) as Products;
            }
        }
    }
    [XmlType("products")]
    [XmlInclude(typeof(Products))]
    public class Products
    {
        [XmlElement("product")]
        public List<Product> Items { get; set; }
    }
    [XmlType("product")]
    [XmlInclude(typeof(Product))]
    public class Product
    {
        [XmlElement("name")]
        String Name { get; set; }

        [XmlElement("description")]
        String Description { get; set; }

        [XmlElement("company")]
        Company Brand { get; set; }

        [XmlElement("grossprice")]
        String GrossPrice { get; set; }

        [XmlElement("netprice")]
        String NetPrice { get; set; }

        [XmlElement("measure")]
        String Measure { get; set; }

        [XmlElement("categoy")]
        ProductCategory Category { get; set; }
    }
    [XmlType("company")]
    [XmlInclude(typeof(Company))]
    public class Company
    {
        [XmlElement("name")]
        public string Name { get; set; }
        [XmlElement("description")]
        public string Description { get; set; }
        [XmlElement("year")]
        public string Year { get; set; }
        [XmlElement("address")]
        public Address Address { get; set; }

        public Company()
        {

        }
    }
    [XmlType("address")]
    [XmlInclude(typeof(Address))]
    public class Address
    {
        [XmlElement("houseno")]
        public string HouseNumber { get; set; }
        [XmlElement("street")]
        public string Street { get; set; }
        [XmlElement("city")]
        public string City { get; set; }
        [XmlElement("country")]
        public string Country { get; set; }
        [XmlElement("pin")]
        public string Pin { get; set; }

        public Address()
        {

        }
    }
    [XmlType("category")]
    [XmlInclude(typeof(ProductCategory))]
    public class ProductCategory
    {
        public ProductCategory()
        {

        }
    }

当您使用正确的 Xml 属性将所有内容转换为标记对象时,这是最简单的。


2
投票

在班级中公开您的属性。如果它们是私有的、受保护的或内部的,则 XmlSerializer 无法看到它们,因此无法设置它们。

© www.soinside.com 2019 - 2024. All rights reserved.