C# 将XML转换为对象

C# 将XML转换为对象,c#,xml,linq,C#,Xml,Linq,我有一个xml,我必须将它反序列化为对象。因为它是嵌套的派生xml,我对linq to xml还不熟悉。我正在分享一些代码,以便您更好地理解我希望从xml中得到什么 这是我的XML <ba:BA_Test xmlns:ba="http://www.testing.com" TimeStamp="2015-04-16T18:15:41.974+0100"> <ba:Hotels> <ba:Hotel HotelCode="3258_811" HotelName="BE

我有一个xml,我必须将它反序列化为对象。因为它是嵌套的派生xml,我对linq to xml还不熟悉。我正在分享一些代码,以便您更好地理解我希望从xml中得到什么

这是我的XML

<ba:BA_Test xmlns:ba="http://www.testing.com" TimeStamp="2015-04-16T18:15:41.974+0100">
<ba:Hotels>
<ba:Hotel HotelCode="3258_811" HotelName="BEST WESTERN">
<ba:RoomTypes>
<ba:RoomType RoomTypeCode="22_3258_811" RoomTypeName="Double plus 1 adult OR 2 childr"/>
<ba:RoomType RoomTypeCode="17_3258_811" RoomTypeName="Double plus 1 adult or child"/>
<ba:RoomType RoomTypeCode="1_3258_811" RoomTypeName="Room for 1"/>
<ba:RoomType RoomTypeCode="18_3258_811" RoomTypeName="Room for 1 Adult and 1 Child"/>
<ba:RoomType RoomTypeCode="2_3258_811" RoomTypeName="Room for 2"/>
</ba:RoomTypes>
<ba:AvailabilityGroup AvailabilityGroupCode="14254_3258_811" AvailabilityGroupName="Standard">
<ba:RoomRates>
<ba:RoomRate RoomRateCode="49069_3258_811" RoomTypeCode="1_3258_811" RoomRateName="Standard Room"/>
<ba:RoomRate RoomRateCode="49071_3258_811" RoomTypeCode="2_3258_811" RoomRateName="Standard Room"/>
<ba:RoomRate RoomRateCode="49462_3258_811" RoomTypeCode="2_3258_811" RoomRateName="Vienna Highlights - Standard Room - For 2 People"/>
<ba:RoomRate RoomRateCode="58367_3258_811" RoomTypeCode="1_3258_811" RoomRateName="Standard Room - Tigrafriends"/>
<ba:RoomRate RoomRateCode="58369_3258_811" RoomTypeCode="2_3258_811" RoomRateName="Standard Room - Tigrafriends"/>
<ba:RoomRate RoomRateCode="70518_3258_811" RoomTypeCode="2_3258_811" RoomRateName="Advent days (shopping) in Vienna - Standard Room"/>
</ba:RoomRates>
</ba:AvailabilityGroup>
</ba:Hotel>
</ba:Hotels>
</ba:BA_Test>

这是我的linq到xml代码,但它不是嵌套的

 XDocument xdoc = XDocument.Load(@"D:\response.xml");
            XNamespace nsr = "http://www.test.com";

            // using Linq To Xml parse and load Objects
            List<Hotel> hotel = (from res in xdoc.Root.Descendants(nsr + "Hotel")
                                 select new Hotel
                                 {
                                     hotel_code = res.Attribute("HotelCode").Value,
                                     hotel_name = res.Attribute("HotelName").Value,

                                 }).ToList<Hotel>();
XDocument xdoc=XDocument.Load(@“D:\response.xml”);
XNSR=”http://www.test.com";
//使用Linq解析和加载Xml对象
List hotel=(从xdoc.Root.substands(nsr+“hotel”)中的res开始)
选择新酒店
{
酒店代码=资源属性(“酒店代码”)。价值,
酒店名称=资源属性(“酒店名称”)。价值,
}).ToList();
这是酒店的舱位

/// 

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.20329.23234")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.testing.com")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.testing.com", IsNullable = false)]
public partial class Hotel
{
    private room_types room_typesField;
    private List<availability_group> availability_groupField;
    private string hotel_codeField;
    private string hotel_nameField;
    /// 
    public room_types room_types
    {
        get
        {
            return this.room_typesField;
        }
        set
        {
            this.room_typesField = value;
        }
    }
    /// 
    public List<availability_group> availability_group
    {
        get
        {
            return this.availability_groupField;
        }
        set
        {
            this.availability_groupField = value;
        }
    }
//
[System.CodeDom.Compiler.GeneratedCodeAttribute(“System.Xml”,“4.0.20329.23234”)]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(“代码”)]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true,命名空间=”http://www.testing.com")]
[System.Xml.Serialization.XmlRootAttribute(命名空间=”http://www.testing.com“,IsNullable=false)]
公共部分舱酒店
{
私人房间类型房间类型字段;
私有列表可用性\u组字段;
科德菲尔德私人字符串酒店;
纳姆菲尔德私人字符串酒店;
/// 
公共房间类型房间类型
{
得到
{
返回此.room\u types字段;
}
设置
{
this.room_types字段=值;
}
}
/// 
公共列表可用性\u组
{
得到
{
返回此.availability\u groupField;
}
设置
{
this.availability_groupField=值;
}
}

以下是如何将此xml转换为单个linq查询。如有任何帮助,将不胜感激。请提前感谢。

这将为您提供正确的结果:-

XNamespace ns = "http://www.testing.com";
List<Hotel> result = xdoc.Descendants(ns + "Hotel")
                  .Select(x => new Hotel
                       {
                          HotelCode = (string)x.Attribute("HotelCode"),
                          HotelName = (string)x.Attribute("HotelName"),
                          RoomTypes = x.Descendants(ns + "RoomType")
                                     .Select(r => new RoomType
                           {
                                   RoomTypeCode = (string)r.Attribute("RoomTypeCode"),
                                   RoomTypeName = (string)r.Attribute("RoomTypeName")
                           }).ToList(),
                         AvailabilityGroup = x.Descendants(ns + "AvailabilityGroup")
                                             .Select(a => new availability_group
                 {
                    AvailabilityGroupCode = (string)a.Attribute("AvailabilityGroupCode"),
                    AvailabilityGroupName = (string)a.Attribute("AvailabilityGroupName") 
                 }).ToList()
         }).ToList();

您也可以像我获取
RoomType
数据一样获取
RoomRates
数据。

我已经编辑了我的问题,即编译时错误已被删除,但我无法创建单个linq查询您的Hotel类看起来像什么?Hotel类包含Hotel code和name等属性。我应该已经澄清了,可以吗请添加它?我已经添加了酒店类谢谢Rahul:)它有效。我想我的酒店类已经实现了一些BIU,但现在问题已经解决了。@CheckingRT-不客气:)如果这对你有帮助,你可以投票并接受答案。
public class Hotel
    {
        public string HotelCode { get; set; }
        public string HotelName { get; set; }
        public List<RoomType> RoomTypes { get; set; }
        public List<availability_group> AvailabilityGroup { get; set; }
    }

    public class RoomType
    {
        public string RoomTypeCode { get; set; }
        public string RoomTypeName { get; set; }
    }

public class availability_group
        {
            public string AvailabilityGroupCode { get; set; }
            public string AvailabilityGroupName { get; set; }
        }