Создание KML с помощью Linq to XML

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

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


person Luis    schedule 24.02.2009    source источник


Ответы (2)


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

person Benjol    schedule 27.04.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, как в приведенном выше примере, это должна быть довольно простая реализация.

person Szymon Rozga    schedule 24.02.2009
comment
Вопросник спросил о linq, и в этом ответе не говорится, КАК использовать класс XmlSerializer. - person Benjol; 27.04.2009