XDocument阅读儿童元素

时间:2014-02-20 23:55:43

标签: c# xml linq linq-to-xml

我刚刚开始使用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");

我该怎么做?

2 个答案:

答案 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;