3

大约 9 个月前,我在 C# 中创建了一组对应于 KML 2.2 元素的类。所以你可以做类似 myPlacemark = new Placemark("name"); 在内部,它使用 XmlDocument、XmlElement 等来创建各种节点和标签。这是一个记忆猪,它可能会更快。不,我没有使用 XSD 生成类。

我看到有关于使用 Linq 读取和解析 KML 的帖子。但是,有没有人使用 Linq to XML 创建 KML?如果不是,您认为创建 progammatic 的最佳方法是什么。易于使用的一组类来抽象 KML?使用 Linq to XML 会提高性能吗?

4

2 回答 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); 
}

与 XML 等效的 Linq 看起来像这样(未经测试)

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 结构的不同方面非常“刚性”)。

于 2009-04-27T12:02:53.717 回答
-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 的对象模型(如上面的示例),那么它应该是一个稍微简单的实现。

于 2009-02-24T14:16:47.577 回答