如何用c#构建XML文件

本文关键字:XML 文件 构建 何用 | 更新日期: 2023-09-27 18:03:23

我有一个如下所示的数据表

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 });

,我想替换以***开头的xml占位符,以便从上述数据表构建格式良好的xml。xml模板如下所示

<?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>

重要的是对于每个cellid (CI)具有相同的siteid,状态,sittype需要在两个<Document>部分下的占位符上增加,如下所示(仅是我发布的文档部分)

     <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>
我是c++的,我真的搞砸了,有谁能帮帮我吗我做了如下图所示的事情,没有任何运气

编辑结果应该如下所示

 <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

两个documents (Points and Lines)对于每个具有相同状态的细胞(Here working)和placemarks应该同时为每个cellids增加

如何用c#构建XML文件

不要老是换问题。根据以前的结果进行工作。

XML文件

<?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>

代码
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"));
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}