XElement и список‹T›

У меня есть класс со следующими свойствами:

public class Author {
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

Далее у меня есть список авторов, например:

List<Author> authors = new List<Author> ();

authors.add(
  new Author { 
    FirstName = "Steven",
    LastName = "King"
  });

authors.add(
  new Author { 
    FirstName = "Homer",
    LastName = ""
  });

Теперь я пытаюсь использовать Linq to XML для создания XML, представляющего мой список авторов.

new XElement("Authors",
  new XElement("Author", 
    from na in this.Authors
    select new XElement("First", na.First)))

Блок выше не генерирует XML, как я ожидаю. Что я получаю:

<Authors>
  <Author>
    <First>Steven</First>
    <First>Homer</First>
  </Author>
<Authors>

Я хочу, чтобы вывод XML выглядел следующим образом:

<Authors>
  <Author>
    <First>Steven</First>
    <Last>King</Last>
  </Author>
  <Author>
    <First>Homer</First>
    <Last></Last>
  </Author>
</Authors>

Любая помощь в том, как заставить XML выглядеть так, как мне нужно, будет очень признательна!


person Jagd    schedule 14.07.2009    source источник


Ответы (2)


Вам нужно передать запрос IEnumerable<XElement> в качестве второго параметра, а не " Автор", например:

// Note the new way to initialize collections in C# 3.0.
List<Author> authors = new List<Author> ()
{
  new Author { FirstName = "Steven", LastName = "King" }),
  new Author { FirstName = "Homer", LastName = "" })
};

// The XML
XElement xml = new XElement("Authors",
    from na in this.Authors
    select new XElement("Author",
        new XElement("First", na.FirstName),
        new XElement("Last", na.LastName)));

Это даст вам нужный результат.

person casperOne    schedule 14.07.2009

Я знаю, что вы используете C#, но сейчас вам стоит серьезно подумать о добавлении проекта VB.NET в свое решение. XML-литералы идеально подходят для этого и значительно упрощают работу.

Чтобы получить XML из списка авторов, вы должны сделать следующее:

Function GetAuthorsXML(authors As List(Of Author)) As XElement
    Return <Authors>
               <%= from a in authors _
                   select <Author>
                              <First><%= a.FirstName %></First>
                              <Last><%= a.LastName %></Last>
                          </Author> %>
           </Authors>
End Function
person CoderDennis    schedule 14.07.2009
comment
Иметь совершенно отдельный проект только для небольшого количества XML-магии в лучшем случае излишне. Если не требуется выполнять огромное количество XML-преобразований (и более сложного характера), добавление еще одной сборки (если только вы не хотите компилировать в модули, а затем сплетать их вместе, что является еще одним PITA) просто добавляет слишком много накладных расходов. в ряде областей. - person casperOne; 05.03.2013
comment
Конечно, если бы это был единственный бит, это было бы лишним. Но разработчику C# по-прежнему полезно знать, что это существует в .NET. И я никогда не работал над системой, в которой не было бы нескольких небольших проектов, поэтому добавление одного для обработки магии XML имеет для меня смысл. - person CoderDennis; 05.03.2013