Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#和LINQ以及递归函数生成KML文件_C#_Xml_Kml - Fatal编程技术网

使用C#和LINQ以及递归函数生成KML文件

使用C#和LINQ以及递归函数生成KML文件,c#,xml,kml,C#,Xml,Kml,我试图在C#中动态创建一个KML文件。我编写了一个递归函数来实现这一点。然而,输出的结果有一点问题。问题是所有位置标记的结束标记的位置。我真的很困惑。请告诉我递归函数在哪里出错 我的代码: private void xmlBuild() { XDocument doc = new XDocument( new XDeclaration("1.0", "utf-8", ""), new XComment("This is comment by me"),

我试图在C#中动态创建一个KML文件。我编写了一个递归函数来实现这一点。然而,输出的结果有一点问题。问题是所有位置标记的结束标记的位置。我真的很困惑。请告诉我递归函数在哪里出错

我的代码:

private void xmlBuild()
    {
XDocument doc = new XDocument(
        new XDeclaration("1.0", "utf-8", ""),
        new XComment("This is comment by me"),
        new XElement(ns+"kml", 
        new XElement(ns+"Document", rec_build())));      
        doc.Save(Server.MapPath(@"~\App_Data\markers2.xml"));
}
private XElement rec_build()
    {
        if (iteration != 0)
        {
            iteration -= 1;
            return final_rec = new XElement(ns + "Placemark",
                    new XAttribute("id", "1"),
                    new XElement(ns + "title", "something"),
                    new XElement(ns + "description", "something"),
                    new XElement(ns + "LookAt",
                    new XElement(ns + "Longitude", "49.69"),
                    new XElement(ns + "Latitude", "32.345")), new XElement(ns + "Point", new XElement(ns + "coordinates", "49.69,32.345,0")),rec_build());
        }
        else
        {
            return null;
        }
    }
这是迭代值2的输出:(请注意文件末尾的placemark id=1的结束标记。它应该在placemark id=2的开始标记之前

<?xml version="1.0" encoding="utf-8"?>
<!--This is comment by me-->
<kml xmlns="http://earth.google.com/kml/2.2">
  <Document>
    <Placemark id="1">
      <title>something</title>
      <description>something</description>
      <LookAt>
        <Longitude>49.69</Longitude>
        <Latitude>32.345</Latitude>
      </LookAt>
      <Point>
        <coordinates>49.69,32.345,0</coordinates>
      </Point>
      <Placemark id="1">
        <title>something</title>
        <description>something</description>
        <LookAt>
          <Longitude>49.69</Longitude>
          <Latitude>32.345</Latitude>
        </LookAt>
        <Point>
          <coordinates>49.69,32.345,0</coordinates>
        </Point>
      </Placemark>
    </Placemark>
  </Document>
</kml>

某物
某物
49.69
32.345
49.69,32.345,0
某物
某物
49.69
32.345
49.69,32.345,0

因此,问题是每次递归时,都会将元素添加到新创建的项中。似乎循环的效果更好

基本上,代码就是这样做的:

设置kml外体 第一次调用并将元素(元素1)添加到kml outerboy 第二次呼叫将要素(要素2)添加到要素(要素1) 第三次呼叫将元素(元素3)添加到元素(元素2)

如果您希望执行递归方法而不是循环机制,请传入对外部kml的引用

如果递归就是这样工作的,那么它就更令人困惑了

(如果我有额外的或缺少的括号、逗号或其他项,很抱歉。我没有在此上安装VS)

循环:

private void xmlBuild()
{
    XElement documentElement = new XElement(ns + "Document");

    for (int i = 0; i < 2; i++)
    {
        documentElement.Add(rec_build());
    }

    XDocument doc = new XDocument(
        new XDeclaration("1.0", "utf-8", ""),
        new XComment("This is comment by me"),
        new XElement(ns + "kml", documentElement));

    doc.Save(Server.MapPath(@"~\App_Data\markers2.xml"));
}

private XElement rec_build()
{

    return new XElement(ns + "Placemark",
           new XAttribute("id", "1"),
           new XElement(ns + "title", "something"),
           new XElement(ns + "description", "something"),
           new XElement(ns + "LookAt",
           new XElement(ns + "Longitude", "49.69"),
           new XElement(ns + "Latitude", "32.345")), 
           new XElement(ns + "Point", 
           new XElement(ns + "coordinates", "49.69,32.345,0")));
}

您正在将递归生成元素添加为Placemark而不是Document的子元素。这应该可以做到:

    private void xmlBuild()
    {
        XElement docElement = new XElement(ns + "Document");
        XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", ""),
                new XComment("This is comment by me"),
                new XElement(ns + "kml", docElement));
        rec_build(docElement);
        doc.Save(Server.MapPath(@"~\App_Data\markers2.xml"));
    }

    private XElement rec_build(XElement docElement)
    {
        if (iteration != 0)
        {
            iteration -= 1;
            return final_rec = new XElement(ns + "Placemark",
                    new XAttribute("id", "1"),
                    new XElement(ns + "title", "something"),
                    new XElement(ns + "description", "something"),
                    new XElement(ns + "LookAt",
                    new XElement(ns + "Longitude", "49.69"),
                    new XElement(ns + "Latitude", "32.345")), 
                    new XElement(ns + "Point", new XElement(ns + "coordinates", "49.69,32.345,0")));
            docElement.Add(final_rec);
            rec_build(docElement);
        }
        else
            return null;
    }

我试过你的代码,这是我作为输出得到的:我在docElement中有一个小的输入错误。Add(final_rec);call,还没有运行此代码,但在修复输入错误时应该可以工作。我第一次尝试使用FOR循环,但更困惑了,所以我想到了使用递归。你对使用循环有什么建议?我接受了你的建议(调用rec_函数outer kml),但没有得到很好的结果。你还有什么建议?@Amim更新了我的回答。应该可以。我只是在头脑中运行了它(没有ide)。循环版本有问题,但递归函数工作得很好!谢谢!这个递归函数最棒!!
    private void xmlBuild()
    {
        XElement docElement = new XElement(ns + "Document");
        XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", ""),
                new XComment("This is comment by me"),
                new XElement(ns + "kml", docElement));
        rec_build(docElement);
        doc.Save(Server.MapPath(@"~\App_Data\markers2.xml"));
    }

    private XElement rec_build(XElement docElement)
    {
        if (iteration != 0)
        {
            iteration -= 1;
            return final_rec = new XElement(ns + "Placemark",
                    new XAttribute("id", "1"),
                    new XElement(ns + "title", "something"),
                    new XElement(ns + "description", "something"),
                    new XElement(ns + "LookAt",
                    new XElement(ns + "Longitude", "49.69"),
                    new XElement(ns + "Latitude", "32.345")), 
                    new XElement(ns + "Point", new XElement(ns + "coordinates", "49.69,32.345,0")));
            docElement.Add(final_rec);
            rec_build(docElement);
        }
        else
            return null;
    }