c# - 如何将 XML 数据加载到数据结构中?

标签 c# .net linq asp.net-core

我有以下 XML 文档

<?xml version = "1.0" encoding = "utf-8"?>
<flights_for_sale>
  <ad id="0001" createdon ="11/02/20" expireson="12/02/20">
    <aircraft id="A10">
      <year> 1977 </year>
      <make> <![CDATA[&c;]]> </make>
      <model> Skyhawk </model>
      <color> Light blue and white </color>
      <description>
        New paint, nearly new interior,
        685 hours SMOH, full IFR King avionics
      </description>
      <price> 23,495 </price>      
    </aircraft>
    <seller id = "s001"  phone="123-123-123"> Skyway Aircraft </seller>
    <seller id = "s002"  phone="123-123-222"> Boeing </seller>
    <seller id = "s003"  phone="123-123-233"> McDouglas </seller>
    <membership id="1000" from="12/03/16" to="12/03/18" no="M0001">Silver</membership>
    <membership id="1000" from="12/03/16" to="12/03/18" no="M0002">Gold</membership>
    <membership id="1000" from="12/03/16" to="12/03/18" no="M0003">Platinum</membership>
    <location>
      <city> Rapid City, </city>
      <state> South Dakota </state>
    </location>
  </ad>
  <ad id="002" createdon ="11/05/20" expireson="12/05/20">
    <aircraft>
      <year> 1965 </year>
      <make> &amp;p; </make>
      <model> Cherokee </model>
      <color> Gold </color>
      <description>
        240 hours SMOH, dual NAVCOMs, DME,
        new Cleveland brakes, great shape
      </description>
    </aircraft>
    <seller phone="555-333-2222"  email="jseller@www.axl.com" id="s004">John Seller</seller>
    <membership id="1000" from="12/03/16" to="12/03/18" no="M0020">State Membership</membership>
    <membership id="1000" from="12/03/16" to="12/03/18" no="M0002">Gold</membership>
    <location>
      <city> St. Joseph, </city>
      <state> Missouri </state>
    </location>
  </ad>
</flights_for_sale>
我有以下 C# 类
    class Advert2
    {
        public int? Id { get; set; }
        public DateTime? CreatedOn { get; set; }
        public DateTime? ExpiresOn { get; set; }
        public Aircraft MyAircraft { get; set; }
        public List<Seller2> MySellers { get; set; }
        public List<Membership> MyMemberships { get; set; }

        public Advert2()
        {
            MySellers = new List<Seller2>();
            MyMemberships = new List<Membership>();
            MyAircraft = new Aircraft();
        }


    }

    class Seller2
    {
        public int? Id { get; set; }
        public string SellerName { get; set; }
        public string Phone { get; set; }
    }

    class Membership
    {
        public int? Id { get; set; }
        public string MembershipNumber { get; set; }

        public DateTime? From { get; set; }

        public DateTime? To { get; set; }

        public String MemberType { get; set; }

    }

    class Aircraft {

        public string Make { get; set; }
        public string Model { get; set; }


        public decimal? Price { get; set; }

        public string Description { get; set; }
    }
然后我使用了以下两种方法来解析 XML 元素和属性(检查 NULL)
    public static class XMLCommons
    {
        
        public static string TryGetElementValue(this XElement parentEl, string elementName, string defaultValue = null)
        {
            var foundEl = parentEl.Element(elementName);

            if (foundEl != null)
            {
                return foundEl.Value;
            }

            return defaultValue;
        }



        public static string TryGetAttribtueValue(this XElement parentEl, string elementName, string attrName, string defaultValue = null)
        {
            var foundEl = parentEl.Element(elementName);

            if (foundEl != null) {
                //check attribute exists 

                var foundAttr = foundEl.Attribute(attrName);
                if (foundAttr != null)
                {
                    return foundAttr.Value;
                }
                
            
            }

            return defaultValue;
        }


    }
然后我编写了以下代码来读取 XML 上的元素/属性,并将数据填充到 Advert2对象结构
            var xmlPath2 = System.IO.Path.Combine("../../../data/" + "XMLFile2.xml");
            var xml2 = XDocument.Load(xmlPath2);
          var query2 = xml2.Root.Descendants("ad").Select(n => new Advert2 { 
                    Id = Convert.ToInt32(n.Parent.TryGetAttribtueValue("ad", "id")),
                    CreatedOn = Convert.ToDateTime( n.Parent.TryGetAttribtueValue("ad", "createdon") ),
                    ExpiresOn = Convert.ToDateTime(n.Parent.TryGetAttribtueValue("ad", "expireson")),
                    MyAircraft = new Aircraft {  
                        Make = n.TryGetElementValue("make"), 
                        Model = n.TryGetElementValue("model"), 
                        Description = n.TryGetElementValue("description"), 
                        Price = Convert.ToDecimal( n.TryGetElementValue("price") ) },
                    MySellers = new List<Seller2>().Add( new Seller2 {
                                                                        Id =  Convert.ToInt32( n.TryGetAttribtueValue("seller","id") ), 
                                                                        SellerName = n.TryGetElementValue("seller"),
                                                                        Phone = n.TryGetAttribtueValue("seller","phone")
                                                                        } )   
            }).ToList();
但问题是当我尝试创建对象来填充时出现语法错误 MySellers列表。
错误:

Error CS0029
Cannot implicitly convert type 'void' to System.Collections.Generic.List<XMLParsing.Seller2>'


所以似乎我不知道如何填充这两个集合 MySellersMyMemberships .
是否可以填充这两个集合,以便我可以创建 Averts2收藏?

最佳答案

我知道这不符合问题的精神。但是,它应该像

var xmlStream = new StreamReader(@"D:\something.xml");
var serializer = new XmlSerializer(typeof(flights_for_sale));
var result = (flights_for_sale)serializer.Deserialize(xmlStream);
下面是通过将xml粘贴到visual studio中获得的
编辑 🡆 特殊粘贴 🡆 将 XML 粘贴为类
// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class flights_for_sale
{

   private flights_for_saleAD[] adField;

   /// <remarks/>
   [System.Xml.Serialization.XmlElementAttribute("ad")]
   public flights_for_saleAD[] ad
   {
      get
      {
         return this.adField;
      }
      set
      {
         this.adField = value;
      }
   }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class flights_for_saleAD
{

   private flights_for_saleADAircraft aircraftField;

   private flights_for_saleADSeller[] sellerField;

   private flights_for_saleADMembership[] membershipField;

   private flights_for_saleADLocation locationField;

   private byte idField;

   private string createdonField;

   private string expiresonField;

   /// <remarks/>
   public flights_for_saleADAircraft aircraft
   {
      get
      {
         return this.aircraftField;
      }
      set
      {
         this.aircraftField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlElementAttribute("seller")]
   public flights_for_saleADSeller[] seller
   {
      get
      {
         return this.sellerField;
      }
      set
      {
         this.sellerField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlElementAttribute("membership")]
   public flights_for_saleADMembership[] membership
   {
      get
      {
         return this.membershipField;
      }
      set
      {
         this.membershipField = value;
      }
   }

   /// <remarks/>
   public flights_for_saleADLocation location
   {
      get
      {
         return this.locationField;
      }
      set
      {
         this.locationField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public byte id
   {
      get
      {
         return this.idField;
      }
      set
      {
         this.idField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public string createdon
   {
      get
      {
         return this.createdonField;
      }
      set
      {
         this.createdonField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public string expireson
   {
      get
      {
         return this.expiresonField;
      }
      set
      {
         this.expiresonField = value;
      }
   }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class flights_for_saleADAircraft
{

   private ushort yearField;

   private string makeField;

   private string modelField;

   private string colorField;

   private string descriptionField;

   private string priceField;

   private string idField;

   /// <remarks/>
   public ushort year
   {
      get
      {
         return this.yearField;
      }
      set
      {
         this.yearField = value;
      }
   }

   /// <remarks/>
   public string make
   {
      get
      {
         return this.makeField;
      }
      set
      {
         this.makeField = value;
      }
   }

   /// <remarks/>
   public string model
   {
      get
      {
         return this.modelField;
      }
      set
      {
         this.modelField = value;
      }
   }

   /// <remarks/>
   public string color
   {
      get
      {
         return this.colorField;
      }
      set
      {
         this.colorField = value;
      }
   }

   /// <remarks/>
   public string description
   {
      get
      {
         return this.descriptionField;
      }
      set
      {
         this.descriptionField = value;
      }
   }

   /// <remarks/>
   public string price
   {
      get
      {
         return this.priceField;
      }
      set
      {
         this.priceField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public string id
   {
      get
      {
         return this.idField;
      }
      set
      {
         this.idField = value;
      }
   }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class flights_for_saleADSeller
{

   private string idField;

   private string phoneField;

   private string emailField;

   private string valueField;

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public string id
   {
      get
      {
         return this.idField;
      }
      set
      {
         this.idField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public string phone
   {
      get
      {
         return this.phoneField;
      }
      set
      {
         this.phoneField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public string email
   {
      get
      {
         return this.emailField;
      }
      set
      {
         this.emailField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlTextAttribute()]
   public string Value
   {
      get
      {
         return this.valueField;
      }
      set
      {
         this.valueField = value;
      }
   }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class flights_for_saleADMembership
{

   private ushort idField;

   private string fromField;

   private string toField;

   private string noField;

   private string valueField;

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public ushort id
   {
      get
      {
         return this.idField;
      }
      set
      {
         this.idField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public string from
   {
      get
      {
         return this.fromField;
      }
      set
      {
         this.fromField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public string to
   {
      get
      {
         return this.toField;
      }
      set
      {
         this.toField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlAttributeAttribute()]
   public string no
   {
      get
      {
         return this.noField;
      }
      set
      {
         this.noField = value;
      }
   }

   /// <remarks/>
   [System.Xml.Serialization.XmlTextAttribute()]
   public string Value
   {
      get
      {
         return this.valueField;
      }
      set
      {
         this.valueField = value;
      }
   }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class flights_for_saleADLocation
{

   private string cityField;

   private string stateField;

   /// <remarks/>
   public string city
   {
      get
      {
         return this.cityField;
      }
      set
      {
         this.cityField = value;
      }
   }

   /// <remarks/>
   public string state
   {
      get
      {
         return this.stateField;
      }
      set
      {
         this.stateField = value;
      }
   }
}

关于c# - 如何将 XML 数据加载到数据结构中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65856219/

相关文章:

c# - 向 Linq-to-SQL 对象添加功能以执行常见选择

c# - LINQ for string StartsWith List<string> 中的某个值

c# - 如何使用 LINQ 根据需要拆分的字符串列表筛选数据表?

asp.net - 将值列表放入 ASP.Net MVC 中的 View 模型中

c# - UITest 失败,返回 : "SetUp : System.InvalidOperationException"

c# - 在没有回发的情况下使用 jquery 在 ASP.NET Web 表单中显示数据插入的转发器

.net - 是否有内置的名称/值对属性?

c# - File.ReadAllText 无法读取

c# - 如何打开/关闭代码模块?

c# - Sharepoint 客户端对象模型查询过滤器不起作用