Это даст вам то, что вы ищете. Конечно, если есть вероятность того, что какой-либо из этих атрибутов присутствует не всегда, вам нужно добавить несколько проверок нулевого значения, чтобы убедиться, что каждый атрибут существует до вызова его свойства Value
.
Если в вашем запросе есть элемент <books>
, вы можете выполнить подзапросы, чтобы выбрать нужные вам элементы <Field>
.
var booksData = from book in xdoc.Descendants("books")
select new Book
{
cat = book.Attribute("cat").Value,
ISBN = book.Attribute("ISBN").Value,
genre = book.Attribute("genre").Value,
Price = (from childField in book.Elements()
where childField.Attribute("name").Value == "Price"
select childField.Attribute("val").Value).SingleOrDefault(),
PublishDate = (from childField in book.Elements()
where childField.Attribute("name").Value == "Publish Date"
select childField.Attribute("val").Value).SingleOrDefault(),
Title = (from childField in book.Elements()
where childField.Attribute("name").Value == "Title"
select childField.Attribute("val").Value).SingleOrDefault()
};
Одна заметка о коде, который вы разместили в вопросе. Метод xdoc.Descendants("root")
на самом деле ничего не делает. from book in xdoc
сделал бы то же самое. Я использовал Descendants("books")
в своем ответе, что, по-моему, вы все равно хотели сделать.