2009-02-24 79 views
3

大約9個月前,我在C#中創建了一組類,它們對應於KML 2.2元素。所以你可以做一些事情,比如myPlacemark = new Placemark(「name」);在內部,它使用XmlDocument,XmlElement等來創建各種節點和標籤。這是一隻記憶豬,它可能會更快。不,我沒有使用XSD生成類。用Linq創建KML到XML

我看到有關於閱讀和使用Linq解析KML的帖子。但是,有沒有人使用Linq來創建KML?如果不是,您認爲最好的方法來創建一個項目。容易使用的一組類來抽象KML?通過使用Linq to XML可以提高性能嗎?

回答

-1

我還沒有使用KML,但Linq to XML庫本質上是System.Xml中XmlDocument,XmlElement等模型的替代品。從記憶的角度來看,我不知道它們是否比目前的解決方案好。

我經常使用的一種方法是創建一組表示Xml文檔的數據類,然後使用XmlSerializer將對象轉換爲Xml。我相當這個實施不是一個偉大的記憶豬,我認爲,爲了你的目的,這可能是有道理的。

下面是一個簡單的例子。說我想新建下面的XML:

<Packages> 
    <Package Name="A"> 

    </Package> 
    <Package Name="B"> 
     <Dependencies> 
      <Dependency Package="C" /> 
      <Dependency Package="A" /> 
     </Dependencies> 
    </Package> 
    <Package Name="C"> 
     <Dependencies> 
      <Dependency Package="A" /> 
     </Dependencies> 
    </Package> 
</Packages > 

您可以創建以下類:

class Package 
{ 
    private List<Dependency> dependencies = new List<Dependency>(); 
    public string Name { get; set; } 
    public List<Dependency> Dependencies { get { return dependencies; } set { dependencies = value; } } 
} 

class Dependency 
{ 
    public string Package { get; set; } 
} 

使用System.Xml.Serialization.XmlSerializer類,你可以把一個列表到上面的XML 。

因此,如果您爲KML創建對象模型,並輕鬆映射到實際的KML(如上面的示例),則應該是一個相當直接的實現。

+0

問問關於linq的問題,這個答案並沒有說明如何使用XmlSerializer類。 – Benjol 2009-04-27 11:49:40

0

不KML,但這裏有鑑於這兩個類(含屬性)使用的System.Xml.Serialization

的例子和初始化:

[XmlRoot("BookList")] 
public class BookList 
{ 
    [XmlElement("BookData")] 
    public List<Book> Books = new List<Book>(); 
} 

public class Book 
{ 
    [XmlElement("Title")] 
    public string Title { get; set; } 
    [XmlAttribute("isbn")] 
    public string ISBN { get; set; } 
} 

var bookList = new BookList 
{ 
    Books = { new Book { Title = "Once in a lifetime", ISBN = "135468" } } 
}; 

您可以序列化成XML,像這樣:

var serializer = new XmlSerializer(typeof(BookList)); 
using (var writer = new StreamWriter("YourFileNameHere")) 
{ 
    serializer.Serialize(writer, bookList); 
} 

等效的LINQ to XML配置將看起來像這樣(未測試)

XElement bookXML = 
    new XElement("BookList", 
     from book in bookList.Books 
     select new XElement("BookData", 
      new XElement("Title", book.Title), 
      new XAttribute("isbn", book.ISBN) 
     ) 
    ); 

結論,兩者都比使用XmlDocument更清潔,XmlSerializer更短,Linq to XML給你更大的靈活性(XmlSerializer在類結構與xml結構的差異方面相當「僵化」)。