2010-12-08 3 views
1

J'ai une collection List<Item> que j'essaie de générer un fichier XML en utilisant Linq vers XML.Problème de requête Linq to XML

La classe de liste est ci-dessous:

public class Item 
{ 
    public int Id { get; set; } 
    public string ItemName {get; set;} 
} 

J'ai besoin de XML qui ressemble à ceci:

<Items> 
    <Item> 
    <ID>1</ID> 
    <Item_Name>Super Sale Item Name</Item_Name> 
    </Item> 
</Items> 

Voici la requête que j'ai essayé mais je suis pas avoir de chance d'apprendre à travailler

XDocument xdoc = new XDocument(new XElement("Items"), 
      _myItemCollection.Select(x => new XElement("Item", 
              new XElement("ID", x.Id), 
              new XElement("Item_Name", x.ItemName)))); 

Je continue d'obtenir une erreur indiquant que le code XML est incorrect. Des idées?

erreur est

Cette opération créerait un document correctement structuré.

à System.Xml.Linq.XDocument.ValidateDocument (XNode précédente, XmlNodeType allowBefore, XmlNodeType allowAfter) à System.Xml.Linq.XDocument.ValidateNode (noeud XNode, XNode précédent) à System.Xml.Linq. XContainer.AddNodeSkipNotify (XNode n) à System.Xml.Linq.XContainer.AddContentSkipNotify (teneur en objet) à System.Xml.Linq.XContainer.AddContentSkipNotify (teneur en objet) à System.Xml.Linq.XContainer.AddContentSkipNotify (Object contenu) à System.Xml.Linq.XDocument..ctor (Object [] contenu)

+0

Pouvez-vous copier/coller l'erreur exacte que vous rencontrez? –

+0

Je l'ai ajouté là, il n'y a pas beaucoup plus. – John

Répondre

4

Essayez ceci:

using System; 
using System.Linq; 
using System.Xml.Linq; 

public class Item 
{ 
    public int Id { get; set; } 
    public string ItemName { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var collection = new[] 
     { 
      new Item {Id = 1, ItemName = "Super Sale Item Name"} 
     }; 

     var xdoc = new XDocument(new XElement("Items", 
           collection.Select(x => new XElement("Item", 
             new XElement("ID", x.Id), 
             new XElement("Item_Name", x.ItemName))))); 

     Console.WriteLine(xdoc); 
    } 
} 

La principale chose qui vous manque est que le projet de votre collection à XElement doit être imbriqué dans le premier XElement ("Items") plutôt que son frère. Notez que new XElement("Items")... est changé en new XElement("Items", ...

+0

C'était ça, a dû enlever ça) et ça a bien fonctionné. Merci. – John

+0

Cela devrait fonctionner, dans votre code, vous avez un 'XDocument' avec des racines différentes, ce qui n'est apparemment pas correct. –

1

vous fermez votre première XElement trop tôt:

XDocument doc = new XDocument(new XElement("Items", 
      items.Select(i => new XElement("Item", 
           new XElement("ID", i.Id), 
           new XElement("Name", i.Name)))));