Member 12686746 Ответов: 1

Как создать XML-файл на основе определенных XML-элементов


У меня есть следующий код, который генерирует xml-файл, однако; узлы не правы ниже код и ожидаемые результаты также добавляются дайте мне знать, что я делаю неправильно на основе ожидаемых результатов и результата, который я получил я получаю данные из результата gridview ниже
EmployeeID date    Hours   JobTitleCode    PayTypeCode
     101631    6/12/2017   7.5            10               3
     101631    6/13/2017   7.5            10               3
     103673    6/18/2017   12.75               9               3


Что я уже пробовал:

try {

            DataSet ds = new DataSet();
            DataTable dtxml = (DataTable)ViewState["Data"];
            ds.Tables.Add(dtxml);

            //Create a new XML doc
            XmlDocument xmlDoc = new XmlDocument();
            string dt = Txtendhour.Text.Replace("/", "");


            // Write down the XML declaration
            //Server.MapPath("directory.xml")
            if (File.Exists(Server.MapPath("PPE" + dt + ".xml")))
            {
                File.Delete(Server.MapPath("PPE" + dt + ".xml"));
            }

            XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "ASCII", null);
            // Create the root element
            XmlElement rootNode = xmlDoc.CreateElement("companyData");
            rootNode.SetAttribute("xmlns", "");
            xmlDoc.InsertBefore(xmlDeclaration, xmlDoc.DocumentElement);
            xmlDoc.AppendChild(rootNode);

            XmlElement headernode = xmlDoc.CreateElement("header");
            headernode.SetAttribute("fileSpecVersion", "2.00.0");
            xmlDoc.DocumentElement.PrependChild(headernode);
            // Create the required nodes
            XmlElement mainNode = xmlDoc.CreateElement("companyId");
            XmlElement descNode = xmlDoc.CreateElement("stateCode");
            XmlElement activeNode = xmlDoc.CreateElement("reportQuarter");
            XmlElement fiscalYear = xmlDoc.CreateElement("federalFiscalYear");
            XmlElement Vendor = xmlDoc.CreateElement("softwareVendorName");
            XmlElement version = xmlDoc.CreateElement("softwareProductName");
            XmlElement vendorversion = xmlDoc.CreateElement("softwareProductVersion");

            // retrieve the text
            string faccode = txtcode.Text;
            string quarter = GridView1.Rows[0].Cells[7].Text;
            XmlText categoryText = xmlDoc.CreateTextNode(faccode);
            XmlText descText = xmlDoc.CreateTextNode("State");
            XmlText activeText = xmlDoc.CreateTextNode(quarter);
            XmlText fiscalYearactiveText = xmlDoc.CreateTextNode("2017");
            XmlText activetext2 = xmlDoc.CreateTextNode("softwarename");
            XmlText activetext3 = xmlDoc.CreateTextNode("Softwaretype");
            XmlText activetext4 = xmlDoc.CreateTextNode("VersionNumber");

            // append the nodes to the parentNode without the value
            headernode.AppendChild(mainNode);
            headernode.AppendChild(descNode);
            headernode.AppendChild(activeNode);
            headernode.AppendChild(fiscalYear);
            headernode.AppendChild(Vendor);
            headernode.AppendChild(version);
            headernode.AppendChild(vendorversion);
            // save the value of the fields into the nodes
            mainNode.AppendChild(categoryText);
            descNode.AppendChild(descText);
            activeNode.AppendChild(activeText);
            fiscalYear.AppendChild(fiscalYearactiveText);
            Vendor.AppendChild(activetext2);
            version.AppendChild(activetext3);
            vendorversion.AppendChild(activetext4);

            // Create a new <Employees> element and add it to the root node
            XmlElement Employees = xmlDoc.CreateElement("employees");
            xmlDoc.DocumentElement.AppendChild(Employees);

            XmlElement parentNode = xmlDoc.CreateElement("EmployeeHours");

            // Set attribute name and value!
            parentNode.SetAttribute("processType", "merge");
            // xmlDoc.DocumentElement.PrependChild(parentNode);

            string id = "";
            string employeeCode = GridView1.Rows[0].Cells[0].Text;



            string fromFormat = "MM/dd/yyyy";
            string toFormat = "yyyy-MM-dd";
            foreach (GridViewRow row in GridView1.Rows)
            {
                //first part of EMPLOYEES ELEMENTS AND CHILD ELEMENTS

                if (id != row.Cells[0].Text)
                {
                    XmlElement employee = xmlDoc.CreateElement("employee");
                    xmlDoc.DocumentElement.AppendChild(employee);
                    Employees.AppendChild(employee);
                    //create the element
                    XmlElement EmployeeID1= xmlDoc.CreateElement("employeeId");
                    employee.AppendChild(EmployeeID1);
                    EmployeeID1.InnerText = row.Cells[0].Text;

                    XmlElement HireDate1 = xmlDoc.CreateElement("hireDate");
                    employee.AppendChild(HireDate1);
                    DateTime newdate = DateTime.ParseExact(row.Cells[6].Text, fromFormat, null);

                    HireDate1.InnerText = newdate.ToString(toFormat);//row.Cells[6].Text;
                    xmlDoc.DocumentElement.InsertAfter(Employees, xmlDoc.DocumentElement.LastChild);
                    id = row.Cells[0].Text;
                }
            }


            string employeenumber = "";

          XmlElement staffHours = xmlDoc.CreateElement("empoyeeHours");
            foreach (GridViewRow row2 in GridView1.Rows)

            {
                XmlElement EmployeeCode= xmlDoc.CreateElement("employeeId");
            XmlElement WorkDays = xmlDoc.CreateElement("workDays");

              if (nursenumber != row2.Cells[0].Text)
                {

                    staffHours.AppendChild(NurseIdCode);
                    employeeCode.InnerText = row2.Cells[0].Text;
                    employeenumber = row2.Cells[0].Text;

                }

                XmlElement WorkDay = xmlDoc.CreateElement("workDay");
                xmlDoc.DocumentElement.PrependChild(WorkDay);
                WorkDays.AppendChild(WorkDay);
                staffHours.AppendChild(WorkDays);
                parentNode.AppendChild(staffHours);
                //Third node and data source
                XmlElement Date = xmlDoc.CreateElement("date");
                WorkDay.AppendChild(Date);
                DateTime converteddate = DateTime.ParseExact(row2.Cells[1].Text, fromFormat, null);
                Date.InnerText = converteddate.ToString(toFormat);


                XmlElement hourEntries = xmlDoc.CreateElement("hourEntries");
                xmlDoc.DocumentElement.PrependChild(hourEntries);
                WorkDay.AppendChild(hourEntries);

                XmlElement HourEntry = xmlDoc.CreateElement("hourEntry");
                xmlDoc.DocumentElement.PrependChild(HourEntry);
                hourEntries.AppendChild(HourEntry);

                //Fourth node and data source
                XmlElement Hours = xmlDoc.CreateElement("hours");
                HourEntry.AppendChild(Hours);
                Hours.InnerText = row2.Cells[2].Text;

                XmlElement JobTitleCode = xmlDoc.CreateElement("jobTitleCode");
                HourEntry.AppendChild(JobTitleCode);
                JobTitleCode.InnerText = row2.Cells[3].Text;

                XmlElement payTypeCode = xmlDoc.CreateElement("payTypeCode");
                HourEntry.AppendChild(payTypeCode);
                payTypeCode.InnerText = row2.Cells[4].Text;

                xmlDoc.DocumentElement.InsertAfter(parentNode, xmlDoc.DocumentElement.LastChild);
                employeenumber = row2.Cells[0].Text;

            }


        }
        catch (Exception ex)
        {
            lblMessage.Visible = true;
            lblMessage.ForeColor = System.Drawing.Color.Red;
            lblMessage.Text = ex.Message;
        }

Мой xml-файл ниже основан на приведенном выше коде (я не включил верхнюю часть xml, так как эта часть просто прекрасна, имейте в виду, что я получаю данные из gridview)
<pre><EmployeeHours>
<employeeId>101631</employeeId>
<workDays>
<workDay>
<date>2017-06-12</date>
<hourEntries>
<hourEntry>
<hours>7.5</hours>
<jobTitleCode>10</jobTitleCode>
<payTypeCode>3</payTypeCode>
</hourEntry>
</hourEntries>
</workDay>
</workDays>
<workDays>
<workDay>
<date>2017-06-13</date>
<hourEntries>
<hourEntry>
<hours>7.5</hours>
<jobTitleCode>10</jobTitleCode>
<payTypeCode>3</payTypeCode>
</hourEntry>
</hourEntries>
</workDay>
</workDays>
<employeeId>103673</employeeId>
<workDays>
<workDay>
<date>2017-06-18</date>
<hourEntries>
<hourEntry>
<hours>12.75</hours>
<jobTitleCode>9</jobTitleCode>
<payTypeCode>3</payTypeCode>
</hourEntry>
</hourEntries>
</workDay>
</workDays>
</EmployeeHours>


я хочу, чтобы тег employeehours закрывался после последнего дня тег days для каждого сотрудника и тег days закрывался сразу после рабочих дней до закрытия тега employeehours, а тег workdays открывался только один раз и закрывался один раз.

1 Ответов

Рейтинг:
2

Graeme_Grant

Прочтите об этом: Использование XML в наборе данных | Microsoft Docs[^]- вы можете писать непосредственно в XML-файл: Запись содержимого набора данных в виде XML-данных | Microsoft Docs[^]