62

サーバーから GML ベースの XML スキーマ (以下のサンプル) の「機能」を取得するために、C# で GIS クライアント ツールを作成しています。抽出は 100,000 フィーチャに制限されています。

最大のextract.xmlは約 150メガバイトになる可能性があると推測しているので、明らかに DOM パーサーは出ています.

それとも、私がまだ考えていないより良い方法がありますか?XLINQ のように、または ????

誰でも私を案内できますか?特に、特定のアプローチのメモリ効率に関して。そうでない場合は、両方のソリューションを「プロトタイプ」し、それらを並べてプロファイルする必要があります。

私は .NET の生エビのようなものです。ガイダンスをいただければ幸いです。

ありがとうございます。キース。


サンプル XML - 最大 100,000 個、特徴ごとに最大 234,600 個の座標。

<feature featId="27168306" fType="vegetation" fTypeId="1129" fClass="vegetation" gType="Polygon" ID="0" cLockNr="51598" metadataId="51599" mdFileId="NRM/TIS/VEGETATION/9543_22_v3" dataScale="25000">
  <MultiGeometry>
    <geometryMember>
      <Polygon>
        <outerBoundaryIs>
          <LinearRing>
            <coordinates>153.505004,-27.42196 153.505044,-27.422015 153.503992 .... 172 coordinates omitted to save space ... 153.505004,-27.42196</coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </geometryMember>
  </MultiGeometry>
</feature>
4

5 に答える 5

65

XmlReader大きな XML ドキュメントを解析するために使用します。XmlReaderXML データへの高速で前方のみの非キャッシュ アクセスを提供します。(前方のみとは、XML ファイルを最初から最後まで読み取ることができるが、ファイル内を後方に移動することはできないことを意味します。)XmlReaderは少量のメモリを使用し、単純な SAX リーダーを使用するのと同じです。

    using (XmlReader myReader = XmlReader.Create(@"c:\data\coords.xml"))
    {
        while (myReader.Read())
        {
           // Process each node (myReader.Value) here
           // ...
        }
    }

XmlReader を使用して、最大 2 ギガバイト (GB) のサイズのファイルを処理できます。

参照: Visual C# を使用してファイルから XML を読み取る方法

于 2009-03-24T05:57:16.123 に答える
12

要約すると、このスレッドをグーグルで見つけた人にとって答えがもう少し明白になります。

.NET 2 より前は、XmlTextReader は標準 API で利用可能な最もメモリ効率の高い XML パーサーでした (thanx Mitch;-)

.NET 2 は XmlReader クラスを導入しましたが、これもまた優れています。これは前方のみの要素反復子です (StAX パーサーに少し似ています)。(サンクス セレブラス;-)

また、XML インスタンスは約 500k を超える可能性があるため、DOM を使用しないでください。

乾杯。キース。

于 2009-03-24T07:23:48.550 に答える
6

SAXパーサーが探しているものかもしれません。SAX では、ドキュメント全体をメモリに読み込む必要はありません。ドキュメントを段階的に解析し、要素を処理しながら処理できるようにします。.NET で提供されている SAX パーサーがあるかどうかはわかりませんが、参照できるオープンソース オプションがいくつかあります。

関連する投稿は次のとおりです。

于 2009-03-24T06:00:17.877 に答える
2

XmlReader を使用する例として、この単純な拡張メソッドを追加したかっただけです (Mitch が答えたように):

public static bool SkipToElement (this XmlReader xmlReader, string elementName)
{
    if (!xmlReader.Read ())
        return false;

    while (!xmlReader.EOF)
    {
        if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == elementName)
            return true;

        xmlReader.Skip ();
    }

    return false;
}

そして使用法:

using (var xml_reader = XmlReader.Create (this.source.Url))
{
    if (!SkipToElement (xml_reader, "Root"))
        throw new InvalidOperationException ("XML element \"Root\" was not found.");

    if (!SkipToElement (xml_reader, "Users"))
        throw new InvalidOperationException ("XML element \"Root/Users\" was not found.");

    ...
}
于 2013-05-27T10:59:40.387 に答える