C# Получить несколько дочерних узлов XML
Мне удалось подключить один XElement к моей программе, хотя мне не повезло с двумя другими, которые у меня есть, я пытался их использовать;
IEnumerable query = from booking в 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 ответ
У вас есть несколько проблем:
Во-первых, ваши элементы данных не являются непосредственными потомками
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, }
Во-вторых, несколько элементов написаны с ошибками:
- CheckOutTime должен быть CheckoutTime
- In-FlightMeals должен быть InFlightMeals.
- CarHire должен быть CareHire (да, "CareHire" в XML).
Таким образом, когда вы делаете (например)
Element("In-FlightMeals").Value
,Element()
возвращает нуль, поэтому вы получаете исключение нулевой ссылки, и ваш код прерывается.В-третьих, элемент
BookTo
полностью отсутствует, такBookTo = holiday.Element("BookTo").Value
генерирует исключение нулевой ссылки.
В целом, я не рекомендую этот подход кодирования. Если какой-либо из ваших элементов XML отсутствует, ваш запрос выдаст исключение, потому что element.Element("name")
будет нулевым Что еще хуже, 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.
}