简体   繁体   中英

How to generate XML from datatable in c#

I have a datatable from database which contains data as follows

ID  NAME    SERVICE                 SITENAME                NODENAME
27883481    EAGLE HILLS PROPERTIES  MANAGED WAN CAPITAL GATE-ADNEC LEANING TOWER    capitalgatetwrill-ra
27883481    EAGLE HILLS PROPERTIES  MANAGED WAN 2020 BLDG   dxbcontactcentreill-rb
27883481    EAGLE HILLS PROPERTIES  MANAGED WAN 2020 BLDG   dxbcontactcentreill-ra
27883481    EAGLE HILLS PROPERTIES  MANAGED WAN CAPITAL GATE-ADNEC LEANING TOWER    capitalgatetwrill-rb
27883481    EAGLE HILLS PROPERTIES  MANAGED LAN CAPITAL GATE-ADNEC LEANING TOWER    capitalgatetwrill-ra
27883481    EAGLE HILLS PROPERTIES  MANAGED LAN 2020 BLDG               dxbcontactcentreill-rb
27883481    EAGLE HILLS PROPERTIES  MANAGED LAN 2020 BLDG               dxbcontactcentreill-ra
27883481    EAGLE HILLS PROPERTIES  MANAGED LAN CAPITAL GATE-ADNEC LEANING TOWER    capitalgatetwrill-rb
27883   EAGLE DRILLS PROPERTIES MANAGED WAN     CAPITAL GATE-ADNEC LEANING TOWER    capitalgatetwrill-ra
27883   EAGLE DRILLS PROPERTIES MANAGED WAN     2020 BLDG               dxbcontactcentreill-rb
27883   EAGLE DRILLS PROPERTIES MANAGED WAN     2020 BLDG               dxbcontactcentreill-ra
27883   EAGLE DRILLS PROPERTIES MANAGED WAN     CAPITAL GATE-ADNEC LEANING TOWER    capitalgatetwrill-rb

And i want to create XMl from above data as shown below which is a prototype of XML

<?xml version="1.0" encoding="utf-8" ?>
<AllSites>
  <SITE_NODES>
    <ID>27883481</ID>
    <NAME>EAGLE HILLS PROPERTIES""</NAME>
    <PARTY_SERVICES>
      <SERVICE_NAME>MANAGED WAN</SERVICE_NAME>
      <SERVICE_SITES>
        <SITE_NAME>CAPITAL GATE-ADNEC LEANING TOWER</SITE_NAME>
        <SITE_NODES>
          <NODE_NAME>capitalgatetwrill-ra</NODE_NAME>
          <NODE_NAME>capitalgatetwrill-rb</NODE_NAME>
        </SITE_NODES>
      </SERVICE_SITES>
      <SERVICE_SITES>
        <SITE_NAME>2020 BLDG</SITE_NAME>
        <SITE_NODES>
          <NODE_NAME>dxbcontactcentreill-rb</NODE_NAME>
          <NODE_NAME>dxbcontactcentreill-ra</NODE_NAME>
        </SITE_NODES>
      </SERVICE_SITES>
    </PARTY_SERVICES>
    <PARTY_SERVICES>
      <SERVICE_NAME>MANAGED LAN</SERVICE_NAME>
      <SERVICE_SITES>
        <SITE_NAME>CAPITAL GATE-ADNEC LEANING TOWER</SITE_NAME>
        <SITE_NODES>
          <NODE_NAME>abcd-ra</NODE_NAME>
          <NODE_NAME>abcd-rb</NODE_NAME>
        </SITE_NODES>
      </SERVICE_SITES>
      <SERVICE_SITES>
        <SITE_NAME>2021 BLDG</SITE_NAME>
        <SITE_NODES>
          <NODE_NAME>pqms-rb</NODE_NAME>
          <NODE_NAME>pqms-ra</NODE_NAME>
        </SITE_NODES>
      </SERVICE_SITES>
    </PARTY_SERVICES>
  </SITE_NODES>
</AllSites>

how to generated it ?DO i need to create an XML template with place holders which should be replaced runtime??or create c# classes and generate it as follows

 public class DetailsBO
    {
        public string ID { get; set; }
        public string NAME { get; set; }
        public string SERVICE { get; set; }
        public List<SitesBO> sites { get; set; }
    }
    public class SitesBO
    {
        public string SITENAME { get; set; }
        public List<NodesBO> noodes { get; set; }
    }
    public class NodesBO
    {
        public string NODENAME { get; set; }
    }

Can somebody give me the c# code

EDIT

Suppose if sitename is blank or empty, all are becoming same service type as either WAN or LAN

 DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(string));
            dt.Columns.Add("NAME", typeof(string));
            dt.Columns.Add("SERVICE", typeof(string));
            dt.Columns.Add("SITENAME", typeof(string));
            dt.Columns.Add("NODENAME", typeof(string));

            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED WAN", "", "capitalgatetwrill-ra" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED WAN", "2020 BLDG", "dxbcontactcentreill-rb" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED WAN", "2020 BLDG", "dxbcontactcentreill-ra" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED WAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-rb" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED LAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-ra" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED LAN", "2020 BLDG", "dxbcontactcentreill-rb" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED LAN", "2020 BLDG", "dxbcontactcentreill-ra" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED LAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-rb" });
            dt.Rows.Add(new object[] { "27883", "EAGLE DRILLS PROPERTIES", "MANAGED WAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-ra" });
            dt.Rows.Add(new object[] { "27883", "EAGLE DRILLS PROPERTIES", "MANAGED WAN", "2020 BLDG", "dxbcontactcentreill-rb" });
            dt.Rows.Add(new object[] { "27883", "EAGLE DRILLS PROPERTIES", "MANAGED WAN", "2020 BLDG", "dxbcontactcentreill-ra" });
            dt.Rows.Add(new object[] { "27883", "EAGLE DRILLS PROPERTIES", "MANAGED WAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-rb" });

The least amount of code is to take the current datatable and output direct to xml. You could modify code to use Entity which will create classes and the serialize the classes. But since you already have the datatable I just took table and make xml direct. It looks like you removed duplicate so I did the same. I also ordered the results.

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(string));
            dt.Columns.Add("NAME", typeof(string));
            dt.Columns.Add("SERVICE", typeof(string));
            dt.Columns.Add("SITENAME", typeof(string));
            dt.Columns.Add("NODENAME", typeof(string));

            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED WAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-ra" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED WAN", "2020 BLDG", "dxbcontactcentreill-rb" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED WAN", "2020 BLDG", "dxbcontactcentreill-ra" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED WAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-rb" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED LAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-ra" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED LAN", "2020 BLDG", "dxbcontactcentreill-rb" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED LAN", "2020 BLDG", "dxbcontactcentreill-ra" });
            dt.Rows.Add(new object[] { "27883481", "EAGLE HILLS PROPERTIES", "MANAGED LAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-rb" });
            dt.Rows.Add(new object[] { "27883", "EAGLE DRILLS PROPERTIES", "MANAGED WAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-ra" });
            dt.Rows.Add(new object[] { "27883", "EAGLE DRILLS PROPERTIES", "MANAGED WAN", "2020 BLDG", "dxbcontactcentreill-rb" });
            dt.Rows.Add(new object[] { "27883", "EAGLE DRILLS PROPERTIES", "MANAGED WAN", "2020 BLDG", "dxbcontactcentreill-ra" });
            dt.Rows.Add(new object[] { "27883", "EAGLE DRILLS PROPERTIES", "MANAGED WAN", "CAPITAL GATE-ADNEC LEANING TOWER", "capitalgatetwrill-rb" });

            dt = dt.AsEnumerable()
                .OrderBy(x => x.Field<string>("ID"))
                .ThenBy(x => x.Field<string>("NAME"))
                .ThenBy(x => x.Field<string>("SERVICE"))
                .ThenBy(x => x.Field<string>("SITENAME"))
                .ThenBy(x => x.Field<string>("NODENAME"))
                .CopyToDataTable();


            string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><AllSites></AllSites>";
            XDocument doc = XDocument.Parse(xml);
            XElement allSites = doc.Root;

            foreach (var idGroup in dt.AsEnumerable().GroupBy(x => x.Field<string>("ID")))
            {
                XElement siteNode = new XElement("SITE_NODE");
                allSites.Add(siteNode);


                siteNode.Add(new XElement("ID", idGroup.Key));
                siteNode.Add(new XElement("NAME", idGroup.First().Field<string>("NAME")));

                XElement partyServices = new XElement("PARTY_SERVICES");
                siteNode.Add(partyServices);

                partyServices.Add(new XElement("SERVICE_NAME", idGroup.First().Field<string>("SERVICE")));


                foreach (var serviceSite in idGroup.GroupBy(x => x.Field<string>("SITENAME")))
                {
                    XElement serviceSites = new XElement("SERVICE_SITES");
                    partyServices.Add(serviceSites);
                    serviceSites.Add(new XElement("SITE_NAME", serviceSite.Key));

                    XElement siteNodes = new XElement("SITE_NODES");
                    serviceSites.Add(siteNodes);

                    string[] nodeNames = serviceSite.Select(x => x.Field<string>("NODENAME")).Distinct().ToArray();
                    foreach (string nodeName in nodeNames)
                    {
                        siteNodes.Add(new XElement("NODE_NAME", nodeName));
                    }
                }
            }

            doc.Save(FILENAME);

        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM