7
votes

LINQ à XML - Comment utiliser XDocument la bonne façon

Maintenant, je vais commencer par dire que ceci est en effet une autorisation. J'ai cependant presque terminé cela jusqu'à ce que j'ai couru dans la syntaxe Linq vers XML.

J'ai 2 classes: piste et CD maintenant dans le cadre de l'assidation, je crée un CD, puis a ajouté quelques pistes à elle. Après avoir cherché de nombreux tutoriels qui expliquent parfaitement comment aller de XML aux objets, je ne peux tout simplement pas sembler obtenir ce travail (objets à XML). P>

J'ai actuellement: P>

(
from c in cds
   select new XAttribute("artist",c.getArtist()),    
   select new XAttribute("name", c.getTitle()) //No not happening!
),


6 commentaires

Pourquoi n'utilisez-vous pas simplement la classe xmlSerializer , puis analysez le résultat à un xdocument ?


@LukeHennerley Je n'en ai pas entendu parler de cela, l'enseignant exposait ce type de structures.


Cela semble être un bon moyen de poser une question de devoirs. Vous semblez avoir manqué quelle ligne l'exception se produit cependant?


@Sayse j'ai mis à jour la question pour montrer la ligne où elle jette l'exception


Essayez de définir les points d'arrêt sur les sélectionnées imbriquées pour voir si peut le réduire un peu plus ..


@Sayse Je peux mettre 3 points d'arrêt et il ne casse pas sur 'Sélectionner un nouveau xelement ("CD", la deuxième fois avant de jette l'exception.


3 Réponses :


1
votes
    select new XElement("cd",  /*From new to the end of this is the error*/
        select new XAttribute("artist",c1.getArtist()),
        select new XAttribute("name", c1.getTitle()),
        new XElement("tracks",
           (
               from t in c1.getTracks()
                   select new XElement("track",
                       new XElement("artist",t1.getArtist()),    
                       new XElement("title",t1.getTitle()),
                       new XElement("length",t1.getLength())
                   )          
           )                    
        )
    )
)  

0 commentaires

3
votes

Il y a quelques problèmes avec votre construction XDocument.

  1. Il doit y avoir exactement un élément racine d'un xdocument. Vos affirmations construisent un élément racine pour chaque CD. LI>
  2. Vous avez d'étranges boucles imbriquées dans votre Linq. Tout d'abord, vous commandez les CD par artiste, puis vous êtes à nouveau itération sur toute la collection de CD lors de la production de l'artiste et des attributs de nom. Vous souhaitez produire ces attributs du CD "actuel". Li>
  3. Vous utilisez "C1" et "T1" dans votre Linq au lieu des variables d'itération "CL" et "T". LI> ol>

    Essayez ceci (pardonnez-moi de tourner vos getters / Setters dans Propriétés: P>

    var xmlOutput = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"),
        new XElement(
            "cds",
            from cd in cds
            orderby cd.Artist.ToUpperInvariant()
            select new XElement(
                "cd",
                new XAttribute("title", cd.Title),
                new XAttribute("artist", cd.Artist),
                new XElement(
                    "tracks",
                    from t in cd.Tracks
                    select new XElement(
                        "track",
                        new XAttribute("artist", t.Artist),
                        new XAttribute("title", t.Title),
                        new XAttribute("length", t.Length))))));
    


0 commentaires

7
votes

Tout d'abord, je vous suggère d'utiliser les propriétés et la nommage de style C # pour des méthodes. Voici comment vos cours pourraient être refactorisés:

var xDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"),
    new XElement("cds",
          from cd in cds
          orderby cd.Artist
          select new XElement("cd",
               new XAttribute("artist", cd.Artist),
               new XAttribute("name", cd.Title),
               from t in cd.Tracks
               select new XElement("track",
                     new XElement("artist", t.Artist),
                     new XElement("title", t.Title),
                     new XElement("length", t.Length)));


0 commentaires