【问题标题】:how to build a xml file in c#如何在c#中构建一个xml文件
【发布时间】:2016-08-21 15:46:22
【问题描述】:

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

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 需要在两个 &lt;Document&gt; 部分下的两个占位符上递增,如下所示(仅文档我正在发布的部分)

     <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) 对于每个具有相同状态的cellids(在这里工作)和placemarks 应该同时为每个cellids 递增

【问题讨论】:

  • 尝试使用DataTable.WriteXml
  • @ Sepehr Farshid 我没有创建新模板,我有 xml 模板,需要将其替换为来自数据表的数据,同时保持层次结构
  • 这是您第三次发布同样的问题。以前的帖子我提供了有效的代码。为什么又问同样的问题?使用以前的代码很容易增加 CI。
  • @jdweng 这段代码的问题是每个状态只有两个文档部分,内部文档部分每个都有地标,每个单元格应该同时增加。这里的文档超出状态并且每次都重复.Nutshell 每个状态只有两个文档

标签: c# asp.net .net xml


【解决方案1】:

不要一直改变问题。根据以前的结果工作。

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

【讨论】:

  • 因为标签上有前缀“gx”。它可能与语句有关:kml.RemoveAll();如果您遇到问题,我可能需要将 RemoveAll() 更改为其他内容,以保留 kml 标记中的“gx”命名空间。
  • 我没有解决问题,因为我不确定这是个问题。尝试以下更改。与原始代码不完全相同。来自:kml.RemoveAll();至:kml.Element(ns + "Folder").Remove();
  • 您可以从正确拼写类别开始。见网页:developers.google.com/kml/documentation/extendeddata。有关所有文档,请参阅:developers.google.com/kml/documentation
  • 我喜欢在这种情况下使用模板 xml 文件。使用模板,您可以在不更改 c# 代码的情况下更改功能。例如,您可以在 xml 模板中更改字体大小/类型或线条大小,并且不需要编译(前提是您添加了这些功能)。我更喜欢使用 Net Library 功能而不是使用 3rd 方 dll。
  • 你有一个样式标签,但不是点。我在上面添加了一个元素,以便您可以根据需要修改样式。您可以根据需要在元素中添加其他样式。样式 id 和样式 url 也必须匹配。在上面的 xml 中,我用 myDefaultStyles 替换了 Zamoras0_0。
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 2011-02-15
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多