XDocument XElement构造函数

时间:2014-04-03 16:54:24

标签: c# linq-to-xml xelement

我正在尝试构建一个动态XDoc,其中包含一个工具用作“路径”的文件夹列表。每个“Folder”元素是树中的另一个层

示例:

Root Level

 -- Folder L0

      -- Folder L1

         -- Folder L2

在XML中表示如下:

<FolderPath>
   <Folder>L0</Folder>
   <Folder>L1</Folder>
   <Folder>L2</Folder>
</FolderPath>

我的代码如下:

        // Build up the innermost folders inside the Folderpath element dynamically         
        XElement folderPath = new XElement();
        folderPath.Add(new XElement(FolderList[0],
            new XAttribute("fromDate", FromDate),
            //attributes for Folder w/ lots of attributes
            new XAttribute("toDate", ToDate),
            new XAttribute("contactName", ContactName),
            new XAttribute("email", Email),
            FolderList[0]));

        for (int i = 1; i < FolderList.Count; i++)
        {
            folderPath.Add(new XElement(FolderList[i]));
        }

FolderList是我在代码中此点之前填充的List。但是我遇到了问题:

XElement folderPath = new XElement();

实现XElement的好方法是什么,以便我可以动态添加FolderList中包含的文件夹?我得到的错误是“System.Xml.Linq.XElement不包含带0参数的构造函数”。

2 个答案:

答案 0 :(得分:1)

XElement类中有no parameter-less constructor您应该像这样初始化它,例如

XElement xFolderPath = new XElement("FolderPath"); 

它接受字符串,因为它可以implicitly转换为XName

克服问题的另一个棘手方法是定义xFolderPath对象实例

答案 1 :(得分:0)

XElement没有无参数构造函数。您想要使用的构造函数需要将XName分配给XElement,并且可选地,您也可以传递该XElement的内容。

您可以在下面的代码中看到创建XElement folderPath变量的位置,我使用XElement(XName name, params object[] content),您传递XElement的名称,并在在这种情况下,我传递了一组XAttribute个对象作为其内容。

之后,我创建了一个名为previousNode的临时XElement对象,并为其分配了folderPath对象。

在for循环中,我使用XElement构造函数创建一个名为newNode的新XElement(XName name),并将其作为内容添加到previousNode XElement,然后设置previousNode作为新创建的newNode,所以任何其他元素都将作为XElement的子元素添加,创建我想要的层次结构,如代码示例所示。

using System;
using System.Collections.Generic;
using System.Xml.Linq;

namespace CommandLineProgram
{
    public class DefaultProgram
    {
        public static void Main(string[] args)
        {
            List<String> FolderList = new List<string>() { "L0", "L1", "L2" };
            DateTime FromDate = DateTime.Now;
            DateTime ToDate = DateTime.Now;
            String ContactName = "ContactName";
            String Email = "contact@email.com";

            XElement folderPath = new XElement(FolderList[0],
                new XAttribute("fromDate", FromDate),
                //attributes for Folder w/ lots of attributes
                new XAttribute("toDate", ToDate),
                new XAttribute("contactName", ContactName),
                new XAttribute("email", Email));

            XElement previousNode = folderPath;
            for (int i = 1; i < FolderList.Count; i++)
            {
                XElement newNode = new XElement(FolderList[i]);
                previousNode.Add(newNode);
                previousNode = newNode;
            }
        }
    }
}

folderPath.ToString()输出

<L0 fromDate="2015-03-23T16:13:52.6702528-05:00" 
    toDate="2015-03-23T16:13:52.6702528-05:00" 
    contactName="ContactName" 
    email="contact@email.com">
  <L1>
    <L2 />
  </L1>
</L0>