使用 C#、.net 4.5
昨天我问的是how to read xml file 。正如昨天所解释的,我可以使用 Descendants()
和Elements()
用于获取我的文件所需的元素。
现在,我有包含一些实体的 xml 文件
<Library>
<Book>
<Author>Harrison FORD</Author>
<Name>Unknown Name</Name>
<Year>2000</Year>
<Genre>Unknown Genre</Genre>
<BookID>fc29b1cf-be41-4ed8-b101-5355396fef10</BookID>
</Book>
<Book>
<Author>Unknown Author</Author>
<Name>Unknown Name</Name>
<Year>2000</Year>
<Genre>Unknown Genre</Genre>
<BookID>29b6d74b-71b3-4df6-af0b-d676ff5d23ad</BookID>
</Book>
...
</Library>
我想要的 - 获取书籍列表(如 List<Book>
),其中书籍 - 它是一个单独的实体,具有与 xml 文件中相同的属性。
根据昨天的讨论尝试下一步
//get collection of all books
var myLib = from el in myDoc.Descendants("Library")
select el.Element("Book");
//create empty book
Book addOneBook = new Book();
//try to get each value and than save to just created book
foreach (var books in myLib)
{
var myBook = from el in books.Descendants("Book")
select el.Element("Author").Value.Trim();
addBook.BookAuthor = myBook.ToString();
...
//save
myListWithBooks.Add(addOneBook);
我的理解是这样的
在调试过程中发现,books
在foreach
就像下面的图片一样 - 正是我想要的
但是,当我尝试从中获取任何元素的值时 - 得到的值并不完全是所需的值 - 就像
想想,我有些想念。我哪里错了?也许我没有完全正确理解或者有些东西是错误的?为什么第一次 - 一切都像我一样工作,而第二次相同的代码返回另一个结果?
Aslo,也许还有另一种方法可以从这个 XML 中获取我需要的信息,但无论如何 - 想知道我现在用这段代码错在哪里。
编辑
最佳答案
您正在查询上调用ToString
- 这不是在单个元素上。
即使您解决了这个问题,您也会向列表中添加对同一对象的大量引用...并且这一切都可以使用 LINQ 更清楚地完成:
List<Book> books = myDoc.Root.Elements("Book")
.Select(x => new Book {
Author = (string) x.Element("Author"),
Name = (string) x.Element("Name"),
Year = (int) x.Element("Year"),
Genre = (string) x.Element("Genre"),
Id = (string) x.Element("BookID")
})
.ToList();
(请注意,我已将属性名称从 BookAuthor
更改为 Author
- 在该类型的属性上重复类型名称是没有意义的。除了图书作者之外,图书
还会有哪些其他作者?)
关于c# - 如何使用 LINQ to XML 接收列表格式的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20790623/