2012-10-12 39 views
0

我想在C#中動態創建一個KML文件。我寫了一個遞歸函數來做到這一點。但是輸出的結果有點問題。問題是關閉所有地標標籤的位置。我很困惑。請告訴我在遞歸函數中我犯了什麼錯誤?用遞歸函數生成使用C#和LINQ的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迭代值輸出:(請注意標ID = 1的結束標記在文件的結尾應該是的開始標記之前。標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> 

回答

1

所以問題是每次遞歸的時候,你所添加的元素,新建項目,這似乎是一個循環會更好地工作。

Essenti烯丙基代碼是這樣做的:

建立KML outbody 第一呼叫和添加元素(要素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"))); 
} 

遞歸:

private void xmlBuild() 
{ 
    XElement docElement = new XElement(ns+"Document"); 
    rec_build(docElement); 
    XDocument doc = new XDocument(
    new XDeclaration("1.0", "utf-8", ""), 
    new XComment("This is comment by me"), 
    new XElement(ns+"kml", docElement)));  
    doc.Save(Server.MapPath(@"~\App_Data\markers2.xml")); 
} 
private XElement rec_build(XElement doc) 
{ 
    if (iteration != 0) 
    { 
     iteration -= 1; 
     doc.Add(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"))); 
     return recBuild(doc); 
    } 
    else 
    { 
     return null; 
    } 
} 
+0

我首先嚐試使用FOR循環來做,但更加困惑,所以我想出了使用遞歸的想法。你對使用循環有什麼建議? –

+0

我去了你的建議(調用rec_function外kml),但沒有得到好的結果。你還有什麼建議? –

+0

@AminM更新了我的回覆。它應該工作。我只是把它貫穿我的頭(沒有ide)。 –

0

你加入個遞歸地將元素構建爲地標的子元素而不是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; 
    } 
+0

我試過你的代碼,這是我得到的輸出: <?xml version =「1.0」encoding =「utf-8」?> <! - 這是我的評論 - >

+0

我在docElement.Add(final_rec)中有一個小的輸入錯誤;打電話,沒有運行此代碼,但它應該在修復打字錯誤 – MrDosu

+0

是的,我注意到,之前。但它不工作...... :(再建議? –