Reputation: 8652
I have a datatable as shown below
DataTable dt = new DataTable();
dt.Columns.Add("region", typeof(string));
dt.Columns.Add("technology", typeof(string));
dt.Columns.Add("sitetype", typeof(string));
dt.Columns.Add("status", typeof(string));
dt.Columns.Add("siteid", typeof(string));
dt.Columns.Add("cellid", typeof(int));
dt.Columns.Add("LONGITUDE", typeof(double));
dt.Columns.Add("LATITUDE", typeof(double));
dt.Columns.Add("SCALE", typeof(double));
dt.Rows.Add(new object[] { "BNGLR", "G", "MACRO", "WORKING", "2330", 23301, 24.4251, 25.6011, 87});
dt.Rows.Add(new object[] { "BNGLR", "G", "MACRO", "WORKING", "2330", 23302, 24.4251, 25.6011, 88});
dt.Rows.Add(new object[] { "BNGLR", "G", "MACRO", "WORKING", "2330", 23303, 24.4251, 25.6011, 89 });
dt.Rows.Add(new object[] { "BNGLR", "G", "MACRO", "OTHERS", "2330", 23304, 27.4251, 54.6011, 89 });
dt.Rows.Add(new object[] { "BNGLR", "G", "MICRO", "WORKING", "2331", 23311, 25.4251, 25.6011, 90 });
dt.Rows.Add(new object[] { "BNGLR", "G", "INDOOR", "WORKING", "2332", 23321, 26.4251, 25.6011, 87 });
dt.Rows.Add(new object[] { "BNGLR", "U", "MACRO", "WORKING", "4330", 43301, 37.4251, 25.6011, 82 });
dt.Rows.Add(new object[] { "BNGLR", "L", "MACRO", "WORKING", "5330", 53301, 19.4251, 15.6011, 80 });
,i want to replace the xml placeholders begins with ***
in order to build a well formed xml from the above datatable.
The xml template is as shown below
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:json="http://www.w3.org/2005/Json">
<Folder>
<name>***Region***</name>
<open>1</open>
<Folder>
<name>***Technology***</name>
<open>1</open>
<Folder>
<name>***SiteType***</name>
<Folder>
<name>***STATUS***</name>
<Document>
<name>POINTS</name>
<Placemark>
<name>***Site Id***</name>
<description><ul>
<li>CI = ***CI***
<li>LONGITUDE = ***LONGITUDE***
<li>LATITUDE = ***LATITUDE***</ul></li>
</description>
<Point>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>***LONGITUDE***,***LATITUDE***,***SCALE***</coordinates>
</Point>
</Placemark>
</Document>
<Document>
<name>LINES</name>
<Style id="Zamoras0_0">
</Style>
<Placemark>
<name>***Site Id***</name>
<styleUrl>#Zamoras0_0</styleUrl>
<MultiGeometry>
<LineString>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>***LONGITUDE***,***LATITUDE***,***SCALE***</coordinates>
</LineString>
</MultiGeometry>
</Placemark>
</Document>
</Folder>
</Folder>
</Folder>
</Folder>
</kml>
The important thing is for each cellid
(CI) coming with same siteid,status,sittype needs to be incremented on both placeholder coming under two <Document>
section like as below(only document sction i am posting)
<Document>
<name>POINTS</name>
//for 23301
<Placemark>
<name>2330</name>
<description><ul>
<li>CI = 23301
<li>LONGITUDE = 24.4251
<li>LATITUDE = 25.6011</ul></li>
</description>
<Point>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>24.4251, 25.6011, 87</coordinates>
</Point>
</Placemark>
//for 23302
<Placemark>
<name>2330</name>
<description><ul>
<li>CI = 23302
<li>LONGITUDE = 24.4251
<li>LATITUDE = 25.6011</ul></li>
</description>
<Point>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>24.4251, 25.6011, 87</coordinates>
</Point>
</Placemark>
</Document>
<Document>
<name>LINES</name>
<Style id="Zamoras0_0">
</Style>
//for 23301
<Placemark>
<name>2330</name>
<styleUrl>#Zamoras0_0</styleUrl>
<MultiGeometry>
<LineString>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>24.4251, 25.6011, 87</coordinates>
</LineString>
</MultiGeometry>
</Placemark>
//for 23302
<Placemark>
<name>2330</name>
<styleUrl>#Zamoras0_0</styleUrl>
<MultiGeometry>
<LineString>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>24.4251, 25.6011, 87</coordinates>
</LineString>
</MultiGeometry>
</Placemark>
</Document>
I am from c++ side, and i really scruewed here,can any one help me i did like shown below without any luck
EDIT Result should be like as below
<Document>
<name>POINTS</name>
//for 23301
<Placemark>
<name>2330</name>
<description><ul>
<li>CI = 23301
<li>LONGITUDE = 24.4251
<li>LATITUDE = 25.6011</ul></li>
</description>
<Point>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>24.4251, 25.6011, 87</coordinates>
</Point>
</Placemark>
//for 23302
<Placemark>
<name>2330</name>
<description><ul>
<li>CI = 23302
<li>LONGITUDE = 24.4251
<li>LATITUDE = 25.6011</ul></li>
</description>
<Point>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>24.4251, 25.6011, 87</coordinates>
</Point>
</Placemark>
</Document>
<Document>
<name>LINES</name>
<Style id="Zamoras0_0">
</Style>
//for 23301
<Placemark>
<name>2330</name>
<styleUrl>#Zamoras0_0</styleUrl>
<MultiGeometry>
<LineString>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>24.4251, 25.6011, 87</coordinates>
</LineString>
</MultiGeometry>
</Placemark>
//for 23302
<Placemark>
<name>2330</name>
<styleUrl>#Zamoras0_0</styleUrl>
<MultiGeometry>
<LineString>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>24.4251, 25.6011, 87</coordinates>
</LineString>
</MultiGeometry>
</Placemark>
</Document
Two documents
(Points and Lines
) for each cellids having same status(Here working) and placemarks
should be incremented simultaneously for each cellids
Upvotes: 0
Views: 156
Reputation: 34421
Don't keep on changing the question. work from previous results.
XML file
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:json="http://www.w3.org/2005/Json">
<Folder>
<name>***Region***</name>
<open>1</open>
<Folder>
<name>***Technology***</name>
<open>1</open>
<Folder>
<name>***SiteType***</name>
<Folder>
<name>***STATUS***</name>
<Document>
<name>POINTS</name>
<Style id="myDefaultStyles">
</Style>
<Placemark>
<name>***SITE ID***</name>
<styleUrl>#myDefaultStyles</styleUrl>
<description>
<li>CI = ***CI***</li>
<li>LONGITUDE = ***LONGITUDE***</li>
<li>LATITUDE = ***LATITUDE***</li>
</description>
<Point>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>***LONGITUDE***,***LATITUDE***,***SCALE***</coordinates>
</Point>
</Placemark>
</Document>
<Document>
<name>LINES</name>
<Style id="myDefaultStyles">
</Style>
<Placemark>
<name>***SITE ID***</name>
<styleUrl>#myDefaultStyles</styleUrl>
<MultiGeometry>
<LineString>
<gx:drawOrder>3</gx:drawOrder>
<coordinates>***LONGITUDE***,***LATITUDE***,***SCALE***</coordinates>
</LineString>
</MultiGeometry>
</Placemark>
</Document>
</Folder>
</Folder>
</Folder>
</Folder>
</kml>
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication9
{
class Program
{
const string FILENAME1 = @"c:\temp\test1.xml";
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("region", typeof(string));
dt.Columns.Add("technology", typeof(string));
dt.Columns.Add("sitetype", typeof(string));
dt.Columns.Add("status", typeof(string));
dt.Columns.Add("siteid", typeof(string));
dt.Columns.Add("cellid", typeof(int));
dt.Columns.Add("LONGITUDE", typeof(double));
dt.Columns.Add("LATITUDE", typeof(double));
dt.Columns.Add("SCALE", typeof(double));
dt.Rows.Add(new object[] { "BNGLR", "G", "MACRO", "WORKING", "2330", 23301, 24.4251, 25.6011, 87 });
dt.Rows.Add(new object[] { "BNGLR", "G", "MACRO", "WORKING", "2330", 23302, 24.4251, 25.6011, 88 });
dt.Rows.Add(new object[] { "BNGLR", "G", "MACRO", "WORKING", "2330", 23303, 24.4251, 25.6011, 89 });
dt.Rows.Add(new object[] { "BNGLR", "G", "MACRO", "OTHERS", "2330", 23304, 27.4251, 54.6011, 89 });
dt.Rows.Add(new object[] { "BNGLR", "G", "MICRO", "WORKING", "2331", 23311, 25.4251, 25.6011, 90 });
dt.Rows.Add(new object[] { "BNGLR", "G", "INDOOR", "WORKING", "2332", 23321, 26.4251, 25.6011, 87 });
dt.Rows.Add(new object[] { "BNGLR", "U", "MACRO", "WORKING", "4330", 43301, 37.4251, 25.6011, 82 });
dt.Rows.Add(new object[] { "BNGLR", "L", "MACRO", "WORKING", "5330", 53301, 19.4251, 15.6011, 80 });
XDocument doc1 = XDocument.Load(FILENAME1);
XElement kml = (XElement)doc1.FirstNode;
XNamespace ns = kml.Name.Namespace;
XElement document = doc1.Descendants().Where(x => x.Name.LocalName == "Document").FirstOrDefault();
string documentStr = document.ToString();
XElement linesDoc = doc1.Descendants().Where(x => x.Name.LocalName == "Document").Skip(1).FirstOrDefault();
string linesStr = linesDoc.ToString();
kml.Element(ns + "Folder").Remove();
var regionRows = dt.AsEnumerable().GroupBy(x => x.Field<string>("region"));
foreach (var region in regionRows)
{
XElement newRegion = new XElement(ns + "Folder", new object[] {
new XElement(ns + "name", region.Key),
new XElement(ns + "open", 1)
});
kml.Add(newRegion);
var technologyRows = region.GroupBy(x => x.Field<string>("technology"));
foreach (var technologyRow in technologyRows)
{
XElement newTechnology = new XElement(ns + "Folder", new object[] {
new XElement(ns + "name", technologyRow.Key),
new XElement(ns + "open", 1)
});
newRegion.Add(newTechnology);
var sitetypeRows = technologyRow.GroupBy(x => x.Field<string>("sitetype"));
foreach (var siteTypeRow in sitetypeRows)
{
XElement newSiteType = new XElement(ns + "Folder", new object[] {
new XElement(ns + "name", siteTypeRow.Key)
});
newTechnology.Add(newSiteType);
var siteStatusRows = siteTypeRow.GroupBy(x => x.Field<string>("status"));
foreach (var siteStatusRow in siteStatusRows)
{
int count = 0;
XElement newStatus = new XElement(ns + "Folder", new object[] {
new XElement(ns + "name", siteStatusRow.Key)
});
newSiteType.Add(newStatus);
XElement pointDoc = null;
XElement lineDoc = null;
foreach (var location in siteStatusRow)
{
string newDocumentStr = documentStr;
newDocumentStr = newDocumentStr.Replace("***SITE ID***", location.Field<string>("siteid"));
newDocumentStr = newDocumentStr.Replace("***CI***", location.Field<int>("cellid").ToString());
newDocumentStr = newDocumentStr.Replace("***LONGITUDE***", location.Field<double>("LONGITUDE").ToString());
newDocumentStr = newDocumentStr.Replace("***LATITUDE***", location.Field<double>("LATITUDE").ToString());
newDocumentStr = newDocumentStr.Replace("***SCALE***", location.Field<double>("SCALE").ToString());
string newlinesStr = linesStr;
newlinesStr = newlinesStr.Replace("***LONGITUDE***", location.Field<double>("LONGITUDE").ToString());
newlinesStr = newlinesStr.Replace("***LATITUDE***", location.Field<double>("LATITUDE").ToString());
newlinesStr = newlinesStr.Replace("***SCALE***", location.Field<double>("SCALE").ToString());
newlinesStr = newlinesStr.Replace("***SITE ID***", location.Field<string>("siteid"));
if (++count == 1)
{
XElement newDoc = XElement.Parse(newDocumentStr);
pointDoc = newDoc;
newSiteType.Add(newDoc);
XElement newLineDoc = XElement.Parse(newlinesStr);
lineDoc = newLineDoc;
newSiteType.Add(newLineDoc);
}
else
{
XElement newDoc = XElement.Parse(newDocumentStr);
pointDoc.Add(newDoc.Element(ns + "Placemark"));
XElement newLine = XElement.Parse(newlinesStr);
lineDoc.Add(newLine.Element(ns + "Placemark"));
}
}
}
}
}
}
}
}
}
Upvotes: 1