Создал класс, помогающий передавать значения из XML:
class ApptDetails
{
// public string date { get; set; }
public string starttime { get; set; }
public string endtime { get; set; }
public string details { get; set; }
public string notes { get; set; }
}
Используя этот формат XML:
<March>
<date>
03/09/2024
<starttime>8:00 AM</starttime>
<endtime>8:30 AM</endtime>
<details>blah1</details>
<notes>blarty1</notes>
</date>
<date>
03/09/2024
<starttime>9:00 AM</starttime>
<endtime>9:30 AM</endtime>
<details>blah2</details>
<notes>blarty2</notes>
</date>
<date>
03/09/2024
<starttime>10:00 AM</starttime>
<endtime>10:30 AM</endtime>
<details>it finally freakin works!!!!</details>
<notes>Can i get an AMEN?</notes>
</date>
</March>
Я даже не мог описать все, что я здесь пробовал. Я исследую это уже больше недели и испробовал более дюжины различных подходов. Это то, где я сейчас нахожусь, и это своего рода кульминация того, что я узнал до сих пор. Прямо сейчас я просто отправляю переменные класса в ящик сообщений для тестирования. Проблема в том, что значения не передаются объекту.
if (File.Exists(@"C:\FSAppointmentsTest\Appointments\" + now.ToString("MMMM") + ".xml"))
{
ApptDetails apptDetails = new ApptDetails();
XDocument appointments = XDocument.Load(@"C:\FSAppointmentsTest\Appointments\" + now.ToString("MMMM") + ".xml");
foreach (var child in appointments.Descendants("starttime"))
{
// XDocument appointmentData = XDocument.Parse("date");
IEnumerable<ApptDetails> result = from date in appointments.Descendants("starttime")
select new ApptDetails()
{
starttime = (string)date.Attribute("starttime").Value.ToString(),
endtime = (string)date.Attribute("endtime").Value.ToString(),
details = (string)date.Attribute("details").Value.ToString(),
notes = (string)date.Attribute("notes").Value.ToString(),
};
System.Windows.Forms.MessageBox.Show(apptDetails.starttime);
System.Windows.Forms.MessageBox.Show(apptDetails.endtime);
System.Windows.Forms.MessageBox.Show(apptDetails.details);
System.Windows.Forms.MessageBox.Show(apptDetails.notes);
}
}
Извиняюсь, если я что-то пропустил. Я читаю отсюда уже давно, но это моя первая настоящая просьба о помощи.
@KlausGütter Не понимаю, что ты имеешь в виду? Я использую неправильную формулировку?





Попробуйте подписаться
using System;
using System.Linq;
using System.Collections.Generic;
using System.Data;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApp10
{
class ApptDetails
{
public DateTime date { get; set; }
public DateTime starttime { get; set; }
public DateTime endtime { get; set; }
public string details { get; set; }
public string notes { get; set; }
public ApptDetails(XElement element)
{
date = DateTime.Parse(element.FirstNode.ToString());
starttime = (DateTime)element.Element("starttime");
endtime = (DateTime)element.Element("starttime");
details = (string)element.Element("details");
notes = (string)element.Element("notes");
}
}
class Program
{
static string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<ApptDetails> details = doc.Descendants("date").Select(x => new ApptDetails(x)).ToList();
}
}
}
Это идеально создает список, но не позволяет мне ссылаться на определенные элементы. Я понял, что для значения сообщения это должно работать как «details.date»? Сообщение об ошибке: ошибка CS1061: «List<Form3.ApptDetails>» не содержит определения «starttime», и не удалось найти доступный метод расширения «starttime», принимающий первый аргумент типа «List<Form3.ApptDetails>» ( вам не хватает директивы using или ссылки на сборку?)
Вы используете неправильный экземпляр деталей. По какой-то причине ваша форма не находит правильный экземпляр данных. Вы используете мой класс ApptDetails или свой исходный класс? Время начала вашего класса было закомментировано.
Я поменял его на твой. Я не думал, что мне больше нужна моя версия?
Похоже, вы пытаетесь отправить объект в форму. Итак, один из способов — добавить объект в качестве параметра конструктора: Form3 form3 = new Form3(подробности). См. мой проект с двумя формами по ссылке: stackoverflow.com/questions/34975508/…
Похоже, ты прав. Понятия не имею, почему я создал строку для пути загрузки документа, загрузил документ, создал детали, используя список в том виде, в котором вы его написали, и попытался напечатать значение в окне сообщений или сослаться на элемент для цикла foreach.
Кроме того, я не использую две формы. Это часть form3_load. Вот почему он отображается как form3 ApptDetails?
Затем у вас есть консольное приложение, загружающее форму, которая открывает форму с помощью конструктора. Каждый раз, когда вы открываете форму с помощью конструктора, вы можете передавать параметры, например список классов, по моей ссылке.
Где находится загрузка Form3?
это проект winform, поэтому вместо public void main у него есть form_load
публичный частичный класс Form3: Form {public Form3() { InitializeComponent(); } Private void Form3_Load (отправитель объекта, EventArgs e) {DateTime now = DateTime.Now; stringmonthDoc = @"C:\FSAppointmentsTest\Appointments\" + now.ToString("MMMM") + ".xml"; dayName1.Text = now.ToString("дддд ММММ дд, гггг"); Назначения XDocument = XDocument.Load(monthDoc); List<ApptDetails> детали = назначений.Descendants("дата").Select(x => new ApptDetails(x)).ToList();
Решение состоит в том, чтобы переместить класс ApptDetails за пределы класса программы. Я изменил свой код выше.
Details — это список, поэтому должно быть: Details.Select(x => x.date)
Похоже, это сработало! Цените свое время
1. вы, наверное, имели в виду
appointments.Descendants("date")- 2. время начала, время окончания и т. д. — это не атрибуты, а элементы,