使用Linq to XML创建KML

3
大约9个月前,我创建了一组用于C#的类,对应于KML 2.2元素。因此,您可以执行诸如myPlacemark = new Placemark(“name”)之类的操作。在内部,它使用XmlDocument,XmlElement等来创建各种节点和标记。它是一个内存猪,可能速度较慢。不,我没有使用XSD生成类。
我看到有关使用Linq读取和解析KML的帖子。但是,有人使用Linq to XML创建KML吗?如果没有,您认为创建程序化、易于使用的一套抽象KML类的最佳方法是什么?使用Linq to XML会提高性能吗?
2个回答

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则提供更大的灵活性(在类结构与xml结构不同的情况下,XmlSerializer相对“严格”)。

-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 类,您可以将 List 转换为上面的 Xml。
因此,如果您为 KML 创建一个对象模型,该模型可以轻松映射到实际的 KML,就像上面的示例一样,那么它应该是一个相对简单的实现。

提问者询问了关于linq的问题,而这个回答并没有说明如何使用XmlSerializer类。 - Benjol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接