c#检索多个XML子节点

时间:2014-12-06 01:03:27

标签: c# xml tags descendant

我设法将一个XElement成功链接到我的程序中虽然我没有运气,但我已经尝试使用其他两个;

IEnumerable query =来自doc.Descendants的预订(" Booking")

虽然我很幸运将这些值放入列表框中。

以下是功能代码:

    private void btnimport_Click(object sender, EventArgs e)
    {
        OpenFileDialog open = new OpenFileDialog();
        open.CheckFileExists = true;
        open.InitialDirectory = "@C:\\";
        open.Filter = "XML Files (*.xml)|*.xml|All Files(*.*)|*.*";
        open.Multiselect = false;

        if (open.ShowDialog() == DialogResult.OK)
        {
            try
            {
                XDocument doc = XDocument.Load(open.FileName);

                //Grabs the customer elements
                var query = from booking in doc.Descendants("Booking")
                select new
                {
                    //Customer Elements
                    CustomerId = booking.Element("CustomerId").Value,
                    Title = booking.Element("Title").Value,
                    Firstname = booking.Element("FirstName").Value,
                    Lastname = booking.Element("LastName").Value,
                    DateofBirth = booking.Element("DateofBirth").Value,
                    Email = booking.Element("Email").Value,
                    HouseNo = booking.Element("HouseNo").Value,
                    Street = booking.Element("Street").Value,
                    Postcode = booking.Element("Postcode").Value,
                    Town = booking.Element("Town").Value,
                    County = booking.Element("County").Value,
                    ContactNo = booking.Element("ContactNo").Value,

                    //Holiday Elements
                    HolidayId = booking.Element("HolidayId").Value,
                    HotelName = booking.Element("HotelName").Value,
                    Location = booking.Element("Location").Value,
                    BookFrom = booking.Element("BookFrom").Value,
                    BookTo = booking.Element("BookTo").Value,
                    CheckInTime = booking.Element("CheckInTime").Value,
                    CheckOutTime = booking.Element("CheckOutTime").Value,
                    NoOfRoomsBooked = booking.Element("NoOfRoomsBooked").Value,
                    RoomType = booking.Element("RoomType").Value,
                    RoomServices = booking.Element("RoomServices").Value,
                    Parking = booking.Element("Parking").Value,
                    Pet = booking.Element("Pet").Value,

                    //TravelInfo Elements
                    TravelInfoId = booking.Element("TravelInfoId").Value,
                    TravellingFrom = booking.Element("TravellingFrom").Value,
                    Destination = booking.Element("Destination").Value,
                    Fare = booking.Element("Fare").Value,
                    TravelInsurance = booking.Element("TravelInsurance").Value,
                    InFlightMeals = booking.Element("In-FlightMeals").Value,
                    LuggageAllowance = booking.Element("LuggageAllowance").Value,
                    ExtraLuggage = booking.Element("ExtraLuggage").Value,
                    CarHire = booking.Element("CarHire").Value,
                    ReturnTransfer = booking.Element("ReturnTransfer").Value,
                };

                //Inputs all of the values in bookings
                foreach (var booking in query)
                {
                    //Customer values
                    txtCustomerId.Text = txtCustomerId.Text + booking.CustomerId;
                    txttitle.Text = txttitle.Text + booking.Title;
                    txtfname.Text = txtfname.Text + booking.Firstname;
                    txtlname.Text = txtlname.Text + booking.Lastname;
                    txtdob.Text = txtdob.Text + booking.DateofBirth;
                    txtemail.Text = txtemail.Text + booking.Email;
                    txthouseno.Text = txthouseno.Text + booking.HouseNo;
                    txtstreet.Text = txtstreet.Text + booking.Street;
                    txtpostcode.Text = txtpostcode.Text + booking.Postcode;
                    txttown.Text = txttown.Text + booking.Town;
                    txtcounty.Text = txtcounty.Text + booking.County;
                    txtcontactno.Text = txtcontactno.Text + booking.ContactNo;

                    //Holiday Values
                    txtHolidayId.Text = txtHolidayId.Text + booking.HolidayId;
                    txthname.Text = txthname.Text + booking.HotelName;
                    txtl.Text = txtl.Text + booking.Location;
                    txtbf.Text = txtbf.Text + booking.BookFrom;
                    txtbt.Text = txtbt.Text + booking.BookTo;
                    txtcit.Text = txtcit.Text + booking.CheckInTime;
                    txtcot.Text = txtcot.Text + booking.CheckOutTime;
                    txtnorb.Text = txtnorb.Text + booking.NoOfRoomsBooked;
                    txtrt.Text = txtrt.Text + booking.RoomType;
                    txtrs.Text = txtrs.Text + booking.RoomServices;
                    txtpark.Text = txtpark.Text + booking.Parking;
                    txtpet.Text = txtpet.Text + booking.Pet;

                    //TravelInfo Values
                    txtTravelInfoId.Text = txtTravelInfoId.Text + booking.TravelInfoId;
                    txttf.Text = txttf.Text + booking.TravellingFrom;
                    txtd.Text = txtd.Text + booking.Destination;
                    txtf.Text = txtf.Text + booking.Fare;
                    txtti.Text = txtti.Text + booking.TravelInsurance;
                    txtifi.Text = txtifi.Text + booking.InFlightMeals;
                    txtla.Text = txtla.Text + booking.LuggageAllowance;
                    txtel.Text = txtel.Text + booking.ExtraLuggage;
                    txtch.Text = txtch.Text + booking.CarHire;
                    txtrtrans.Text = txtrtrans.Text + booking.ReturnTransfer;
                }

                MessageBox.Show("XML has been imported");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

如果有人知道我出错的地方或我需要添加/更改的内容,请告诉我们:)

非常感谢, 10gez10

1 个答案:

答案 0 :(得分:1)

你有几个问题:

  1. 首先,您的数据元素不是booking元素的直接子元素,有中间元素<Customer><Holiday><TravelInfo>。因此,您需要执行类似

    的操作
            var query = from booking in doc.Descendants("Booking")
                        let customer = booking.Element("Customer")
                        let holiday = booking.Element("Holiday")
                        let travelInfo = booking.Element("TravelInfo")
                        select new
                        {
                            //Customer Elements
                            CustomerId = customer.Element("CustomerId").Value,
                            Title = customer.Element("Title").Value,
                            HolidayId = holiday.Element("HolidayId").Value,
                            TravelInfoId = travelInfo.Element("TravelInfoId").Value,
                        }
    
  2. 其次,几个元素拼写错误:

    • CheckOutTime应为CheckoutTime
    • In-FlightMeals应为InFlightMeals。
    • CarHire应该是CareHire(是的“CareHire”就是XML中的内容。)

    因此,当您执行(例如)Element("In-FlightMeals").Value时,Element()将返回null,因此您将获得空引用异常并且代码将被中止。

  3. 第三,元素BookTo完全缺失,因此BookTo = holiday.Element("BookTo").Value会生成空引用异常。

  4. 更一般地说,我不推荐这种编码方法。如果缺少任何XML元素,则查询将抛出异常,因为element.Element("name")将为null。更糟糕的是,Visual Studio似乎没有报告出现空引用的准确行号,而是提供select new语句的行号。并且(至少在我的版本上),也不可能进入匿名类型的构造函数。这使调试几乎不可能。

    相反,跳过中间匿名类型并以更直接,更传统的方式执行操作:

                foreach (var booking in doc.Descendants("Booking"))
                {
                    var customer = booking.Element("Customer");
                    var holiday = booking.Element("Holiday");
                    var travelInfo = booking.Element("TravelInfo");
    
                    XElement element;
    
                    if (customer != null)
                    {
                        if ((element = customer.Element("CustomerId")) != null)
                            txtCustomerId.Text = txtCustomerId.Text + element.Value;
                    }
                    // And so on.
                }