2009-02-24 43 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结构的差异方面相当“僵化”)。