C # XML-разбор с LINQ хранения непосредственно в структуре? - PullRequest
0 голосов
/ 17 января 2011

Скажем, у меня есть следующая XML-схема:

<root>
   <version>2.0</version>
   <type>fiction</type>
   <chapters>
      <chapter>1</chapter>
      <title>blah blah</title>
   </chapter>
   <chapters>
      <chapter>2</chapter>
      <title>blah blah</title>
   </chapters>
</root>

Возможно ли проанализировать элементы, которые, как мне известно, не будут повторяться в XML, и сохранить их непосредственно в структуре с помощью LINQ?

Например, могу ли я сделать что-то подобное для «версии» и «типа»

//setup structs
Book book = new Book();
book.chapter = new Chapter();

//use LINQ to parse the xml
var bookData = from b in xmlDoc.Decendants("root")
               select new
               {
                   book.version = b.Element("version").Value,
                   book.type = b.Element("type").Value
               };

//then for "chapters" since I know there are multiple I can do:
var chapterData = from c in xmlDoc.Decendants("root"
                  select new
                  {
                    chapter = c.Element("chapters")   
                  };

foreach (var ch in chapterData)
{
    book.chapter.Add(getChapterData(ch.chapter));
}

1 Ответ

2 голосов
/ 17 января 2011

Учитывая ваш пример XML, вы сможете проанализировать XML в одном месте.Ради этого ответа предположим, что ваши Book и Chapter следующие

class Book
{
    public string Version { get; set; }
    public string Type { get; set; }
    public List<Chapter> Chapters { get; set; }
}

class Chapter
{
    public int Number { get; set; }
    public string Title { get; set; }
}

Затем, чтобы использовать XML для создания Book объекта, мы можем сделать это

Book book = new Book
{
    Version = xmlDoc.Root.Element("version").Value,
    Type = xmlDoc.Root.Element("type").Value,
    Chapters = (from chapter in xmlDoc.Descendants("chapters")
                select new Chapter
                {
                    Number = (int)chapter.Element("chapter"),
                    Title = chapter.Element("title").Value
                }).ToList()
};

Примечание: я собираюсь пойти на занятия здесь, потому что структуры должны быть небольшими и (предпочтительно) неизменяемыми, тогда как ваша книга и ее главы могут быть последними, но вряд ли будут первыми.Тот факт, что объект инкапсулирует другие неструктуры, является для меня мертвой раздачей того, что объект также не должен быть структурным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...