【问题标题】:C# Element from XML Not Getting Bound To ClassXML 中的 C# 元素未绑定到类
【发布时间】:2021-05-18 02:39:28
【问题描述】:

我有以下 XML -

My XML

类结构->

public class AvailabilityResponse
  {
    public string property_id { get; set; }
    public List<AvailRoom> rooms { get; set; }
    public Links links { get; set; }
    public int score { get; set; }
    public string Type { get; set; }
    public string Message { get; set; }
    public string status { get; set; }
  }
public class AvailRoom
  {
    public string id { get; set; }
    public string room_name { get; set; }
    public List<AvailRate> rates { get; set; }
  }
[Serializable]
  public class AvailRate
  {
    public string id { get; set; }
    public int available_rooms { get; set; }
    public bool refundable { get; set; }
    public bool fenced_deal { get; set; }
    public bool fenced_deal_available { get; set; }
    public bool deposit_required { get; set; }
    public string merchant_of_record { get; set; }
    public List<Amenity> amenities { get; set; }
    public Links links { get; set; }
    //[XmlElement(ElementName = "bed_groups")]
    //public List<BedGroups> bed_groups { get; set; }
    [XmlElement(ElementName = "bed_groups")]
    public List<BedGroup> bed_groups { get; set; }
    public List<CancelPenalty> cancel_penalties { get; set; }
    public Dictionary<string, occupancy_pricing> occupancy_pricing { get; set; }
    public occupancy_pricing Occupancy { get; set; }
  }
public class BedGroup
  {
    public Links links { get; set; }
    public List<Configuration> configuration { get; set; }
  }
[Serializable]
  public class Links
  {

    public PaymentOptions payment_options { get; set; }

    public Book book { get; set; }

    public PriceCheck price_check { get; set; }

    public AdditionalRates additional_rates { get; set; }

    public Retrieve retrieve { get; set; }

    public Cancel cancel { get; set; }

    public Change change { get; set; }

    public string method { get; set; }

    public string href { get; set; }

  }
[Serializable]
  public class PriceCheck
  {
    public string method { get; set; }
    public string href { get; set; }
  }

结构的问题是,除了bed_groups,所有其他元素都被绑定了。

我尝试了不同的条件,比如用 Visual Studio 序列化 xml 类,用不同的标签注释它们。但这没有用。

例如。 cancel_penalties 具有类似的结构,但它正确绑定到 c# 类。 bed_groups 没有被绑定。每次它都为空,尽管值存在于 xml 中。

是因为 - &lt;a:item xmlns:a="item" item="37316" type="object"&gt; in bed_groups 和其他标签它只有 - &lt;item type="object"&gt; 吗?

有什么办法可以解决这个问题?

【问题讨论】:

    标签: c# .net xml serialization


    【解决方案1】:

    您需要命名空间。下面的代码是您的类的一个子集,并且已经过测试并且可以工作

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            const string FILENAME = @"c:\temp\test.xml";
            static void Main(string[] args)
            {
                XmlReader reader = XmlReader.Create(FILENAME);
                XmlSerializer serizlizer = new XmlSerializer(typeof(AvailabilityResponse));
                AvailabilityResponse response = (AvailabilityResponse)serizlizer.Deserialize(reader);
            }
        }
        public class AvailabilityResponse
        {
            [XmlArray("item")]
            [XmlArrayItem("rooms")]
            public List<AvailRoom> rooms { get; set; }
        }
        public class AvailRoom
        {
            public Item item { get; set; }
        }
        public class Item
        {
            public string id { get; set; }
            public string room_name { get; set; }
            [XmlArray("rates")]
            [XmlArrayItem("item")]
            public List<AvailRate> rates { get; set; }
        }
        [Serializable]
        public class AvailRate
        {
            [XmlElement(ElementName = "bed_groups")]
            public List<BedGroup> bed_groups { get; set; }
        }
        public class BedGroup
        {
            [XmlElement(ElementName = "item", Namespace = "item")]
            public BedGroupItem item { get; set; }
        }
        public class BedGroupItem
        {
            [XmlElement(Namespace = "")]
            public Links links { get; set; }
            [XmlElement(Namespace = "")]
            public List<Configuration> configuration { get; set; }
        }
        public class Links
        {
        }
        public class Configuration
        {
        }
     
    }
    

    【讨论】:

      【解决方案2】:

      您需要使用下面描述的类结构。 `

      using System;
      using System.Xml.Serialization;
      using System.Collections.Generic;
      namespace Xml2CSharp
      {
      [XmlRoot(ElementName="property_id")]
      public class Property_id {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="id")]
      public class Id {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="room_name")]
      public class Room_name {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="status")]
      public class Status {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="available_rooms")]
      public class Available_rooms {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="refundable")]
      public class Refundable {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="member_deal_available")]
      public class Member_deal_available {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="package")]
      public class Package {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="member")]
      public class Member {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="corporate")]
      public class Corporate {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="distribution")]
      public class Distribution {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="sale_scenario")]
      public class Sale_scenario {
          [XmlElement(ElementName="package")]
          public Package Package { get; set; }
          [XmlElement(ElementName="member")]
          public Member Member { get; set; }
          [XmlElement(ElementName="corporate")]
          public Corporate Corporate { get; set; }
          [XmlElement(ElementName="distribution")]
          public Distribution Distribution { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="deposit_required")]
      public class Deposit_required {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="merchant_of_record")]
      public class Merchant_of_record {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="name")]
      public class Name {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="item", Namespace="item")]
      public class Item {
          [XmlElement(ElementName="id")]
          public Id Id { get; set; }
          [XmlElement(ElementName="name")]
          public Name Name { get; set; }
          [XmlAttribute(AttributeName="a", Namespace="http://www.w3.org/2000/xmlns/")]
          public string A { get; set; }
          [XmlAttribute(AttributeName="item")]
          public string _item { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlElement(ElementName="description")]
          public Description Description { get; set; }
          [XmlElement(ElementName="links")]
          public Links Links { get; set; }
          [XmlElement(ElementName="configuration")]
          public Configuration Configuration { get; set; }
          [XmlElement(ElementName="nightly")]
          public Nightly Nightly { get; set; }
          [XmlElement(ElementName="totals")]
          public Totals Totals { get; set; }
      }
      
      [XmlRoot(ElementName="amenities")]
      public class Amenities {
          [XmlElement(ElementName="item", Namespace="item")]
          public List<Item> Item { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="method")]
      public class Method {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="href")]
      public class Href {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="payment_options")]
      public class Payment_options {
          [XmlElement(ElementName="method")]
          public Method Method { get; set; }
          [XmlElement(ElementName="href")]
          public Href Href { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="links")]
      public class Links {
          [XmlElement(ElementName="payment_options")]
          public Payment_options Payment_options { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlElement(ElementName="price_check")]
          public Price_check Price_check { get; set; }
          [XmlElement(ElementName="additional_rates")]
          public Additional_rates Additional_rates { get; set; }
          [XmlElement(ElementName="recommendations")]
          public Recommendations Recommendations { get; set; }
      }
      
      [XmlRoot(ElementName="description")]
      public class Description {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="price_check")]
      public class Price_check {
          [XmlElement(ElementName="method")]
          public Method Method { get; set; }
          [XmlElement(ElementName="href")]
          public Href Href { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="type")]
      public class Type {
          [XmlAttribute(AttributeName="type")]
          public string _type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="size")]
      public class Size {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="quantity")]
      public class Quantity {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="item")]
      public class Item2 {
          [XmlElement(ElementName="type")]
          public Type Type { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string _Type { get; set; }
          [XmlElement(ElementName="size")]
          public Size Size { get; set; }
          [XmlElement(ElementName="quantity")]
          public Quantity Quantity { get; set; }
          [XmlElement(ElementName="item")]
          public List<Item2> Item2 { get; set; }
          [XmlElement(ElementName="id")]
          public Id Id { get; set; }
          [XmlElement(ElementName="status")]
          public Status Status { get; set; }
          [XmlElement(ElementName="available_rooms")]
          public Available_rooms Available_rooms { get; set; }
          [XmlElement(ElementName="refundable")]
          public Refundable Refundable { get; set; }
          [XmlElement(ElementName="member_deal_available")]
          public Member_deal_available Member_deal_available { get; set; }
          [XmlElement(ElementName="sale_scenario")]
          public Sale_scenario Sale_scenario { get; set; }
          [XmlElement(ElementName="deposit_required")]
          public Deposit_required Deposit_required { get; set; }
          [XmlElement(ElementName="merchant_of_record")]
          public Merchant_of_record Merchant_of_record { get; set; }
          [XmlElement(ElementName="amenities")]
          public Amenities Amenities { get; set; }
          [XmlElement(ElementName="links")]
          public Links Links { get; set; }
          [XmlElement(ElementName="bed_groups")]
          public Bed_groups Bed_groups { get; set; }
          [XmlElement(ElementName="occupancy_pricing")]
          public Occupancy_pricing Occupancy_pricing { get; set; }
          [XmlElement(ElementName="promotions")]
          public Promotions Promotions { get; set; }
          [XmlElement(ElementName="room_name")]
          public Room_name Room_name { get; set; }
          [XmlElement(ElementName="rates")]
          public Rates Rates { get; set; }
      }
      
      [XmlRoot(ElementName="configuration")]
      public class Configuration {
          [XmlElement(ElementName="item")]
          public Item2 Item2 { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="bed_groups")]
      public class Bed_groups {
          [XmlElement(ElementName="item", Namespace="item")]
          public Item Item { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="value")]
      public class Value {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="currency")]
      public class Currency {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="nightly")]
      public class Nightly {
          [XmlElement(ElementName="item")]
          public Item2 Item2 { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="request_currency")]
      public class Request_currency {
          [XmlElement(ElementName="value")]
          public Value Value { get; set; }
          [XmlElement(ElementName="currency")]
          public Currency Currency { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="billable_currency")]
      public class Billable_currency {
          [XmlElement(ElementName="value")]
          public Value Value { get; set; }
          [XmlElement(ElementName="currency")]
          public Currency Currency { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="gross_profit")]
      public class Gross_profit {
          [XmlElement(ElementName="request_currency")]
          public Request_currency Request_currency { get; set; }
          [XmlElement(ElementName="billable_currency")]
          public Billable_currency Billable_currency { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="inclusive")]
      public class Inclusive {
          [XmlElement(ElementName="request_currency")]
          public Request_currency Request_currency { get; set; }
          [XmlElement(ElementName="billable_currency")]
          public Billable_currency Billable_currency { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="exclusive")]
      public class Exclusive {
          [XmlElement(ElementName="request_currency")]
          public Request_currency Request_currency { get; set; }
          [XmlElement(ElementName="billable_currency")]
          public Billable_currency Billable_currency { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="strikethrough")]
      public class Strikethrough {
          [XmlElement(ElementName="request_currency")]
          public Request_currency Request_currency { get; set; }
          [XmlElement(ElementName="billable_currency")]
          public Billable_currency Billable_currency { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="marketing_fee")]
      public class Marketing_fee {
          [XmlElement(ElementName="request_currency")]
          public Request_currency Request_currency { get; set; }
          [XmlElement(ElementName="billable_currency")]
          public Billable_currency Billable_currency { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="totals")]
      public class Totals {
          [XmlElement(ElementName="gross_profit")]
          public Gross_profit Gross_profit { get; set; }
          [XmlElement(ElementName="inclusive")]
          public Inclusive Inclusive { get; set; }
          [XmlElement(ElementName="exclusive")]
          public Exclusive Exclusive { get; set; }
          [XmlElement(ElementName="strikethrough")]
          public Strikethrough Strikethrough { get; set; }
          [XmlElement(ElementName="marketing_fee")]
          public Marketing_fee Marketing_fee { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="occupancy_pricing")]
      public class Occupancy_pricing {
          [XmlElement(ElementName="item", Namespace="item")]
          public Item Item { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="deal")]
      public class Deal {
          [XmlElement(ElementName="id")]
          public Id Id { get; set; }
          [XmlElement(ElementName="description")]
          public Description Description { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="promotions")]
      public class Promotions {
          [XmlElement(ElementName="deal")]
          public Deal Deal { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="rates")]
      public class Rates {
          [XmlElement(ElementName="item")]
          public Item Item { get; set; }
          [XmlElement(ElementName="item")]
          public Item2 Item2 { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="rooms")]
      public class Rooms {
          [XmlElement(ElementName="item")]
          public Item Item { get; set; }
          [XmlElement(ElementName="item")]
          public List<Item2> Item2 { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="additional_rates")]
      public class Additional_rates {
          [XmlElement(ElementName="method")]
          public Method Method { get; set; }
          [XmlElement(ElementName="href")]
          public Href Href { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="recommendations")]
      public class Recommendations {
          [XmlElement(ElementName="method")]
          public Method Method { get; set; }
          [XmlElement(ElementName="href")]
          public Href Href { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }
      
      [XmlRoot(ElementName="score")]
      public class Score {
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
          [XmlText]
          public string Text { get; set; }
      }
      
      [XmlRoot(ElementName="AvailabilityResponse")]
      public class AvailabilityResponse {
          [XmlElement(ElementName="item")]
          public Item Item { get; set; }
          [XmlAttribute(AttributeName="type")]
          public string Type { get; set; }
      }`
      

      您可以将您的 XML 粘贴到 XMLTOC# 以将任何 XML 转换为 c# 类

      【讨论】:

      • 我试过这个。为什么我的班级结构中的 cancel_penalties 工作正常而不是 bed_groups ?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2016-02-23
      • 2019-06-16
      相关资源
      最近更新 更多