xdocument从头开始创建

时间:2018-06-04 18:39:27

标签: foreach linq-to-xml nullreferenceexception

Noobie到XML / Xdocument世界。 尝试使用可变数量的DataField元素创建一个Xdocument,这些元素作为元组列表传入。 此文档用作API调用的一部分,用于编辑远程服务器上的记录中的字段。 当我尝试在foreach循环中添加DataField元素时,xdoc被视为Null。所以我不断收到NullReferenceException错误。 为什么我刚刚创建它时xdoc或其XElements = null? 我知道这不是一个困难的情况,但在最近几天我浏览了几个网站 很明显,我没有得到非常基本的东西。

public XDocument MakeXDoc(string frmID, string prj, List<Tuple<string, string, string>> frmdata)
{
    XNamespace ns = "http://xxxxxxx.yyyyyy.com/api/v1/";
    var xdoc = new XDocument(
         new XDeclaration("1.0", "utf-8", null),
         new XElement(ns + "ProjectDataRequest",
         new XElement(ns + "Project",
         new XElement(ns + "DataFields", new XAttribute("ProjectId", prj), new XAttribute("FormId", frmID),
         new XElement(ns + "DataField" , new XAttribute("DataFieldId", ""), new XAttribute("Value", "") )))));

        foreach (Tuple<string, string, string> fld in frmdata)
        {
            XElement xdf = new XElement(ns + "DataField", new XAttribute("DataFieldId", fld.Item1.ToString()), new XAttribute("Value", fld.Item3.ToString()));
            xdoc.Element(ns + "DataField").Add(xdf);
        }

    return xdoc;
}

1 个答案:

答案 0 :(得分:0)

抛出异常,因为还没有元素。要构建所需的XML,您可以使用LINQ&#39; Select

XDocument MakeXDoc(string frmID, string prj, List<Tuple<string, string, string>> frmdata)
{
    XNamespace ns = "http://xxxxxxx.yyyyyy.com/api/v1/";
    var xdoc = new XDocument(
        new XDeclaration("1.0", "utf-8", null),
        new XElement(ns + "ProjectDataRequest",
        new XElement(ns + "Project",
        new XElement(ns + "DataFields", new XAttribute("ProjectId", prj), new XAttribute("FormId", frmID),
        frmdata.Select(d => new XElement(ns + "DataField", new XAttribute("DataFieldId", d.Item1), new XAttribute("Value", d.Item3)))))));

    return xdoc;
}

它为DataField中的每个项目添加了一个新的frmdata元素作为DataFields的子项。