Я хотел бы иметь возможность возвращать строго типизированные объекты вместо XElements из кода, который передает потоки XML-документа. Скажем XML документ в вопросе:Как вернуть строго типизированные объекты вместо XElements при потоковой передаче документа XML
<?xml version="1.0" encoding="utf-8" ?>
<People>
<Person>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
</Person>
<Person>
<FirstName>Adam</FirstName>
<LastName>Smith</LastName>
</Person>
<Person>
<FirstName>Jane</FirstName>
<LastName>Smith</LastName>
</Person>
</People>
В настоящее время, мой читатель код выглядит следующим образом:
public class PeopleReader
{
public static IEnumerable<XElement> StreamPerson(string path)
{
using (XmlReader rdr = XmlReader.Create(path))
{
rdr.MoveToContent();
while (rdr.Read())
{
if (rdr.NodeType == XmlNodeType.Element && rdr.Name == "Person")
{
XElement item = XElement.ReadFrom(rdr) as XElement;
if (item != null)
yield return item;
}
}
}
}
}
текущий код вызова является:
// Current implementation
foreach (var person in PeopleReader.StreamPerson(@"...\People.xml"))
{
MessageBox.Show(person.Element("LastName").Value);
}
, где я должен позвонить .Element
и .Value
.
То, что я хотел бы иметь, как вызывающий код является:
// Required implementation where person is returned as a strongly typed obj.
foreach (var person in PeopleReader.StreamPerson(@"...\People.xml"))
{
MessageBox.Show(person.LastName);
}
Я понимаю, что я могу использовать xsd.exe генерировать файл .xsd генерировать .cs файлы, но я не ясно фактические шаги. Кроме того, я не уверен, как изменить код считывателя, чтобы вернуть генерируемые классы, чтобы вызывающий код получал строго типизированные объекты для перечисления? То есть, как я могу перейти от XElements к строго типизированным классам? Кастинг не кажется вариантом?
Я использую VS2015 и, по возможности, предпочитаю не использовать сторонние инструменты.
Большое спасибо заранее.
Сначала вам понадобятся те сильные типы. Можно ли написать их вручную, или они должны быть сгенерированы? –
Привет @HenkHolterman, не выполнимо сделать вручную. Сгенерировано лучше всего. Я использовал простой пример здесь, чтобы передать свою точку. – Cleve