2014-02-20 6 views
1

Я только что начал использовать Linq для XML с C#. У меня есть XML-файл, содержащий информацию о книгах.XDocument чтение дочерних элементов

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"); 

Как бы я это сделал?

ответ

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; 
} 

Однако я хотел бы предложить объектно-ориентированный подход:

Почему бы не создать класс книги с автора и название свойства, то вам не нужен метод GetBookAuthor ?

public class Book 
{ 
    public string Title { get; set; } 
    public string Author { get; set; } 
    // other Book properties ... 
} 

Чтобы получить список объектов книги:

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(); 
} 

Вы можете вернуть объект книги по имени:

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 и т. д.

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(); 

Затем проверьте утратившим возвращает имя автора:

if(author != null) 
    return author; 
Смежные вопросы