c # Получить несколько дочерних узлов XML

1

Мне удалось связать один XElement успешно в моей программе, хотя мне не повезло с двумя другими, которые у меня есть, я пробовал использовать;

IEnumerable query = от бронирования в doc.Descendants("Бронирование")

Хотя мне не повезло, если вы разместили значения в списке.

Здесь код функции:

    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

  • 0
    Какая ошибка возникает? Вы устанавливаете те же свойства, например, txtCustomerId.Text в цикле foreach, что выглядит странно.
  • 0
    Я пытаюсь поймать исключение для xml, я получаю следующую ошибку: imgur.com/wbqeBwy . Причиной дублирования одного и того же текстового поля является синтаксис, который генерирует xml.linq, если он не был объявлен дважды. Не знаю почему, но ты
Показать ещё 2 комментария
Теги:
tags
descendant

1 ответ

1
Лучший ответ

У вас есть несколько проблем:

  1. Во-первых, ваши элементы данных не являются непосредственными <TravelInfo> элементами элемента 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 генерирует исключение нулевой ссылки.

В более общем плане, я не рекомендую этот подход кодирования. Если какой-либо из ваших XML-элементов отсутствует, ваш запрос element.Element("name") исключение, потому что 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.
            }
  • 1
    Спасибо, приятель, я прочитал твой отзыв, изменил его с анонимного на предложенный конструктор цикла foreach, и он работает со всеми тремя потомками, а также проверяет орфографические ошибки и т. Д. Этот поток может быть закрыт :).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню