Как создать XDocument с foreach и LINQ?

Я могу использовать XDocument для создания следующего файла, который отлично работает:

XDocument xdoc = new XDocument
(
    new XDeclaration("1.0", "utf-8", null),
    new XElement(_pluralCamelNotation,
        new XElement(_singularCamelNotation,
            new XElement("id", "1"),
            new XElement("whenCreated", "2008-12-31")
        ),
        new XElement(_singularCamelNotation,
            new XElement("id", "2"),
            new XElement("whenCreated", "2008-12-31")
            )
        )
);

Однако, мне нужно создать XML файл с помощью итерации через коллекцию следующим образом:

XDocument xdoc = new XDocument
(
    new XDeclaration("1.0", "utf-8", null));

foreach (DataType dataType in _dataTypes)
{
    XElement xelement = new XElement(_pluralCamelNotation,
        new XElement(_singularCamelNotation,
        new XElement("id", "1"),
        new XElement("whenCreated", "2008-12-31")
    ));
    xdoc.AddInterally(xelement); //PSEUDO-CODE
}

Добавить, AddFirst, AddAfterSelf, AddBeforeSelf, но я не мог заставить их работать в данном контексте.

Является ли итерация с LINQ таким, как это возможно?

Ответ:

Я взял предложение кода Jimmy с корневым тегом, немного изменил его, и это было именно то, что я искал:

var xdoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement(_pluralCamelNotation,
        _dataTypes.Select(datatype => new XElement(_singularCamelNotation,
            new XElement("id", "1"),
            new XElement("whenCreated", "2008-12-31")
        ))
    )
);

Марк Гравелл опубликовал лучший ответ на этот qaru.site/info/361521/....

Ответы

Ответ 1

Вам нужен корневой элемент.

var xdoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement("Root",
        _dataTypes.Select(datatype => new XElement(datatype._pluralCamelNotation,
            new XElement(datatype._singlarCamelNotation),
            new XElement("id", "1"),
            new XElement("whenCreated", "2008-12-31")
        ))
    )
);

Ответ 2

Если я не ошибаюсь, вы должны иметь возможность использовать XDocument.Add():

XDocument xdoc = new XDocument
(
    new XDeclaration("1.0", "utf-8", null));

foreach (DataType dataType in _dataTypes)
{
    XElement xelement = new XElement(_pluralCamelNotation,
        new XElement(_singularCamelNotation,
        new XElement("id", "1"),
        new XElement("whenCreated", "2008-12-31")
    ));
    xdoc.Add(xelement);
}

Ответ 3

Я знаю, что это очень старый пост, но я наткнулся на это сегодня, пытаясь решить ту же проблему. Вы должны добавить элемент в корень документа:

xdoc.Root.Add(xelement);