Linq到XML查询问题

时间:2010-12-08 04:49:59

标签: c# linq-to-xml

我有一个List<Item>集合,我试图生成一个使用Linq到XML的xml文件。

List类如下:

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

我需要获得如下所示的XML:

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

这是我试过的查询,但没有运气

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

我一直收到一条错误消息,说它会创建无效的XML。有什么想法吗?

错误是

此操作会创建一个结构不正确的文档。

在System.Xml.Linq.XDocument.ValidateDocument(XNode previous,XmlNodeType allowBefore,XmlNodeType allowAfter)    在System.Xml.Linq.XDocument.ValidateNode(XNode节点,XNode上一个)    在System.Xml.Linq.XContainer.AddNodeSkipNotify(XNode n)    在System.Xml.Linq.XContainer.AddContentSkipNotify(对象内容)    在System.Xml.Linq.XContainer.AddContentSkipNotify(对象内容)    在System.Xml.Linq.XContainer.AddContentSkipNotify(对象内容)    在System.Xml.Linq.XDocument..ctor(Object [] content)

2 个答案:

答案 0 :(得分:4)

试试这个:

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

您缺少的主要内容是您的集合XElement的项目需要嵌套在第一个XElement(“项目”)而不是它的兄弟。请注意,new XElement("Items")...已更改为new XElement("Items", ...

答案 1 :(得分:1)

你太早关闭你的第一个XElement:

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