我刚刚开始使用Linq to XML with C#。我有一个XML文件,其中包含有关书籍的信息。
XML文件具有以下结构:
<?xml version="1.0"?>
<catalog>
<book id="bk112">
<author>Galos, Mike</author>
<title>Visual Studio 7: A Comprehensive Guide</title>
<genre>Computer</genre>
<price>49.95</price>
<publish_date>2001-04-16</publish_date>
<description>Microsoft Visual Studio 7 is explored in depth,
looking at how Visual Basic, Visual C++, C#, and ASP+ are
integrated into a comprehensive development
environment.</description>
</book>
</catalog>
我设法编写代码,让我从XML文件中获取作者列表和书籍列表:
public List<string> GetBooks()
{
XDocument document = XDocument.Load(XMLFileLocation);
var query = from t in document.Descendants("title")
select t.Value;
return query.ToList<string>();
}
但是,我不知道如何制作一种方法让我获得有关特定图书的信息。例如:
GetBookAuthor("MyBook");
我该怎么做?
答案 0 :(得分:4)
如果您想坚持使用XDocument,这是通过图书名称获取作者的简单方法:
public static string GetBookAuthor(XDocument xDoc, string title)
{
return xDoc.Root
.Elements("book")
.First(b => b.Element("title").Value == title)
.Element("author")
.Value;
}
但是我建议面向对象的方法:
为什么不创建一个包含Author和Title属性的Book类,那么您不需要GetBookAuthor方法?
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
// other Book properties ...
}
获取Book对象列表:
public static List<Book> GetBooks()
{
XDocument document = XDocument.Load(xmlFile);
var query = from t in document.Root.Elements("book")
select new Book()
{
Author = t.Element("author").Value,
Title = t.Element("title").Value
};
return query.ToList();
}
然后,您可以按名称返回Book对象:
public static Book GetBook(List<Book> bookList, string title)
{
return bookList.First(b => b.Title == title);
}
访问作者属性:
var bookList = GetBooks()
var author = GetBook(bookList, "MyBook").Author;
现在,如果作者是更复杂的元素,您也可以创建一个Author类等。
答案 1 :(得分:2)
如果您想按ID
搜索:
var author = document.Descendans("book")
.Where(x => (string)x.Attribute("id") == id)
.Select(x => (string)x.Element("author"))
.FirstOrDefault();
如果您想按Title
搜索:
var author = document.Descendans("book")
.Where(x => (string)x.Element("title") == title)
.Select(x => (string)x.Element("author"))
.FirstOrDefault();
然后检查null并返回作者姓名:
if(author != null)
return author;