3

約 9 か月前、KML 2.2 要素に対応する一連のクラスを C# で作成しました。したがって、次のようなことができます myPlacemark = new Placemark("name"); 内部的には、XmlDocument、XmlElement などを使用してさまざまなノードとタグを作成します。これはメモリ豚であり、おそらくより高速になる可能性があります。いいえ、XSD を使用してクラスを生成しませんでした。

Linq を使用した KML の読み取りと解析に関する投稿があるようです。ただし、Linq to XML を使用して KML を作成した人はいますか? そうでない場合、プログラマティックを作成するための最良のアプローチは何だと思いますか。KML を抽象化するための使いやすい一連のクラス? Linq to XML を使用するとパフォーマンスが向上しますか?

4

2 に答える 2

0

KML ではありませんが、System.Xml.Serialization の使用例を次に示します。

これら 2 つのクラス (属性を含む) と初期化を考えると、次のようになります。

[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 から 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 構造とどのように異なるかという点でかなり「厳格」です)。

于 2009-04-27T12:02:53.717 に答える
-1

私は KML を扱ったことはありませんが、Linq to XML ライブラリは基本的に、System.Xml の XmlDocument、XmlElement などのモデルに代わるものです。メモリの観点から、現在のソリューションよりも優れているかどうかはわかりません。

私がよく使用する 1 つの方法は、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 に答える