Linq to XML query query - PullRequest
       26

Linq to XML query query

1 голос
/ 08 декабря 2010

У меня есть коллекция List<Item>, которую я пытаюсь сгенерировать с помощью Linq to 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, XmlNodeTypeallowAfter) в System.Xml.Linq.XDocument.ValidateNode (узел XNode, предыдущий XNode) в System.Xml.Linq.XContainer.AddNodeSkipNotify (XNode n) в System.Xml.Linq.XContainer.AddContentSkipNotify (содержимое объекта).Xml.Linq.XContainer.AddContentSkipNotify (содержимое объекта) в System.Xml.Linq.XContainer.AddContentSkipNotify (содержимое объекта) в System.Xml.Linq.XDocument..ctor (содержимое объекта [])

Ответы [ 2 ]

4 голосов
/ 08 декабря 2010

Попробуйте это:

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 голос
/ 08 декабря 2010

Вы закрываете свой первый XElement слишком рано:

XDocument doc = new XDocument(new XElement("Items",
            items.Select(i => new XElement("Item",
                                new XElement("ID", i.Id),
                                new XElement("Name", i.Name)))));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...