Создание KML с Linq to XML - PullRequest
       33

Создание KML с Linq to XML

3 голосов
/ 24 февраля 2009

Около 9 месяцев назад я создал набор классов в C #, которые соответствуют элементам KML 2.2. Таким образом, вы можете делать такие вещи, как myPlacemark = new Placemark ("name"); Внутренне он использует XmlDocument, XmlElement и т. Д. Для создания различных узлов и тегов. Это свинья памяти, и это может быть быстрее. Нет, я не генерировал классы с использованием XSD.

Я вижу сообщения о чтении и разборе KML с использованием Linq. Однако кто-нибудь использовал Linq to XML для создания KML? Если нет, то, что вы думаете, является лучшим подходом для создания прогамматики. легко использовать набор классов для абстрагирования KML? Будет ли улучшена производительность при использовании Linq to XML?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2009

Не 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).

0 голосов
/ 24 февраля 2009

Я не работал с KML, но библиотеки Linq to XML по сути являются заменой модели XmlDocument, XmlElement и т. Д. В System.Xml. С точки зрения памяти, я не знаю, лучше ли они, чем ваше текущее решение.

Один из подходов, которые я часто использую, - это создание набора классов данных, представляющих документ 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, как в примере выше, это должно быть несколько простой реализацией.

...