xdocument создать с нуля - PullRequest
       20

xdocument создать с нуля

0 голосов
/ 04 июня 2018

Новичок в мире XML / Xdocument.Попытка создать Xdocument с переменным количеством элементов DataField, которые передаются в виде списка кортежей.Этот документ используется как часть вызова API для редактирования полей в записи на удаленном сервере.Когда я пытаюсь добавить элементы DataField в цикл foreach, 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 голосов
/ 04 июня 2018

Выдает исключение, потому что элемента еще нет.Чтобы создать нужный XML, вы можете использовать LINQ 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.

.
...