2009-07-14 7 views
8

Ich habe eine Klasse, die die folgenden Eigenschaften hat:XElement und Liste <T>

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

Als nächstes habe ich eine Liste der Autoren wie so:

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

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

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

Nun, ich versuche, Linq zu verwenden zu XML, um das XML zu generieren, das meine Autorenliste darstellt.

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

Der obige Block erzeugt nicht das XML, wie ich es erwarte. Was ich erhalte, ist:

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

Was ich die XML-Ausgabe aussehen soll ist:

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

Jede Hilfe, wie die XML zu bekommen aussehen wie ich es brauche immens geschätzt werden würde!

Antwort

11

Sie benötigen die IEnumerable<XElement> Abfrage als zweiten Parameter zu übergeben, nicht den „Autor“ string, etwa so:

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

, die Ihnen das Ergebnis Sie benötigen.

2

Ich weiß, dass Sie C# verwenden, aber dieses Mal sollten Sie ernsthaft überlegen, ein VB.NET-Projekt zu Ihrer Lösung hinzuzufügen. XML-Literale sind dafür perfekt und machen es viel einfacher.

Um die XML-Daten aus Ihrem Autor Liste zu bekommen, können Sie dies tun würden:

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 
+1

ein * ganz eigenes Projekt Mit * nur für ein wenig von XML-Magie ist übertrieben, am besten. Wenn es nicht eine enorme Menge an XML-Transformationen gibt, die (und von einer komplexeren Art) durchgeführt werden müssen, fügt das Hinzufügen einer anderen Assembly (es sei denn, Sie möchten Module kompilieren und dann zusammenfassen, was ein anderes PITA ist) einfach zu viel Overhead hinzu in einer Reihe von Bereichen. – casperOne

+1

Natürlich, wenn das das einzige bisschen wäre, wäre das übertrieben. Für einen C# -Entwickler ist es jedoch immer noch wichtig zu wissen, dass dies in .NET vorhanden ist. Und ich habe noch nie an einem System gearbeitet, auf dem es nicht mehrere kleine Projekte gab. Daher ist es sinnvoll, eine XML-Magie hinzuzufügen. – CoderDennis