如何使用foreach和LINQ构建XDocument?

14

我可以使用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
}

这里有AddAddFirstAddAfterSelfAddBeforeSelf等方法,但是我尝试它们都没有在这种情境下起作用。

使用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")
        ))
    )
);

Marc Gravell在这个StackOverflow问题上发布了更好的答案。

4个回答

26
你需要一个根元素。
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")
        ))
    )
);

3
如果我没记错的话,您应该能够使用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);
}

2
当我使用那段代码时,我得到了“这将创建一个错误结构的XML文档”的提示。我尝试用“tests”和“test”替换变量,但是仍然出现相同的错误。 - Edward Tanguay

3

我知道这是一个非常老的帖子,但今天我偶然发现它并尝试解决同样的问题。你需要将该元素添加到文档的根节点中:

xdoc.Root.Add(xelement);

2

2
我猜作者想要一个LINQ解决方案来解决这个问题,但似乎没有一个。实际上,这是一个有趣的问题 - 如何将IEnumerable转换为适当的参数列表 =) - Dmitri Nesteruk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接