この記事は翻訳者によって翻訳されたものです。 記事の文章にポインターを重ねると、原文のテキストが表示されます。 |
訳文
原文
|
XStreamingElement クラス
遅延ストリーム出力をサポートする XML ツリー内の要素を表します。
アセンブリ: System.Xml.Linq (System.Xml.Linq.dll 内)
XStreamingElement 型で公開されるメンバーは以下のとおりです。
| 名前 | 説明 | |
|---|---|---|
|
XStreamingElement(XName) | 指定した XName から XElement クラスの新しいインスタンスを初期化します。 |
|
XStreamingElement(XName, Object) | 指定した名前と内容を使用して、XStreamingElement クラスの新しいインスタンスを初期化します。 |
|
XStreamingElement(XName, Object()) | 指定した名前と内容を使用して、XStreamingElement クラスの新しいインスタンスを初期化します。 |
| 名前 | 説明 | |
|---|---|---|
|
Add(Object) | 指定した内容をこの XStreamingElement に子として追加します。 |
|
Add(Object()) | 指定した内容をこの XStreamingElement に子として追加します。 |
|
Equals(Object) | 指定した Object が、現在の Object と等しいかどうかを判断します。 (Object から継承されます。) |
|
Finalize | オブジェクトがガベージ コレクションにより収集される前に、そのオブジェクトがリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。) |
|
GetHashCode | 特定の型のハッシュ関数として機能します。 (Object から継承されます。) |
|
GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) |
|
MemberwiseClone | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) |
|
Save(Stream) | この XStreamingElement を指定した Stream に出力します。 |
|
Save(String) | このストリーム要素をシリアル化してファイルに書き込みます。 |
|
Save(TextWriter) | このストリーム要素をシリアル化して TextWriter に書き込みます。 |
|
Save(XmlWriter) | このストリーム要素をシリアル化して XmlWriter に書き込みます。 |
|
Save(Stream, SaveOptions) | オプションで書式設定動作を指定して、この XStreamingElement を指定した Stream に出力します。 |
|
Save(String, SaveOptions) | このストリーム要素をシリアル化してファイルに書き込み、必要に応じて、書式設定を無効にします。 |
|
Save(TextWriter, SaveOptions) | このストリーム要素をシリアル化して TextWriter に書き込み、必要に応じて、書式設定を無効にします。 |
|
ToString | このストリーム要素に対して書式 (インデント) が設定された XML を返します。 (Object.ToString をオーバーライドします。) |
|
ToString(SaveOptions) | このストリーム要素に対して XML を返し、必要に応じて、書式設定を無効にします。 |
|
WriteTo | このストリーム要素を XmlWriter に書き込みます。 |
このクラスを使用すると、遅延ストリーム出力をサポートする XML ツリーを作成できます。 このクラスを使用する XML ツリーの作成は、XElement を使用する XML ツリーの作成とよく似ています。 ただし、基本的な違いがあります。 XElement を使用して XML ツリーを作成する際に LINQ クエリを使用して内容を指定する場合、クエリ変数は XML ツリーの構築時に反復処理され、クエリ結果が XML ツリーに追加されます。 一方、XStreamingElement を使用して XML ツリーを作成する場合は、クエリ変数への参照は反復処理されずに XML ツリーに保存されます。 クエリが反復処理されるのは、シリアル化のときだけです。 このため、メモリの使用量を抑えたまま、より大きな XML ツリーを作成できます。
テキスト ファイルなどの入力ソースからストリーム処理を行う場合、メモリの使用量を抑えたまま、非常に大きなテキスト ファイルなどを読み取り、大量の XML ドキュメントを生成することができます。
メモリに読み込まれた大きな XML ツリーがあり、そのドキュメントの変換バージョンが必要な場合もあります。 XElement を使って新しいドキュメントを作成した場合、変換が完了した時点でメモリに 2 つの大きな XML ツリーができます。 ただし、XStreamingElement を使って新しい XML ツリーを作成した場合、ワーキング セットのサイズは事実上半分になります。
XStreamingElement を使用したプログラムをデバッグする場合、オブジェクトの値を表示するとその ToString メソッドが呼び出されることに注意してください。 これにより XML がシリアル化されます。 ストリーム要素をストリームできるのは 1 回のみという形式のストリーム要素クエリの場合、デバッグ時に望ましくない動作が発生する可能性があります。
次の例では、まずソース XML ツリーを作成します。 次に、XElement を使ってソース XML ツリーを変換します。 この変換によりメモリに新しいツリーが作成されます。 次に、XStreamingElement を使ってソース XML ツリーを変換します。 この変換では、変換後のツリーがシリアル化されてコンソールに出力されるまでクエリは実行されません。 この処理では、より少ないメモリが使用されます。
XElement srcTree = new XElement("Root", new XElement("Child", 1), new XElement("Child", 2), new XElement("Child", 3), new XElement("Child", 4), new XElement("Child", 5) ); XElement dstTree1 = new XElement("NewRoot", from el in srcTree.Elements() where (int)el >= 3 select new XElement("DifferentChild", (int)el) ); XStreamingElement dstTree2 = new XStreamingElement("NewRoot", from el in srcTree.Elements() where (int)el >= 3 select new XElement("DifferentChild", (int)el) ); Console.WriteLine(dstTree1); Console.WriteLine("------"); Console.WriteLine(dstTree2);
この例を実行すると、次の出力が生成されます。
<NewRoot> <DifferentChild>3</DifferentChild> <DifferentChild>4</DifferentChild> <DifferentChild>5</DifferentChild> </NewRoot> ------ <NewRoot> <DifferentChild>3</DifferentChild> <DifferentChild>4</DifferentChild> <DifferentChild>5</DifferentChild> </NewRoot>
テキスト ファイルの処理方法の 1 つに、yield return コンストラクトを使用してテキスト ファイルを一度に 1 行ずつストリーム処理する拡張メソッドを作成する方法があります。 この場合、遅延方式でテキスト ファイルを処理する LINQ クエリを記述します。 このときに XStreamingElement を使用して出力をストリーム処理すると、ソース テキスト ファイルのサイズに関係なく、テキスト ファイルを使用メモリ量が最小の XML に変換できます。
次のテキスト ファイル People.txt はこの例のソースです。
#This is a comment 1,Tai,Yee,Writer 2,Nikolay,Grachev,Programmer 3,David,Wright,Inventor
次のコードには、テキスト ファイルの行を別の方法でストリーム処理する拡張メソッドが含まれています。
メモ |
|---|
C# の yield return コンストラクトを使用する例を次に示します。 Visual Basic 2008 にはこれに相当する機能がないため、この例の対象は C# のみとなります。 |
public static class StreamReaderSequence { public static IEnumerable<string> Lines(this StreamReader source) { String line; if (source == null) throw new ArgumentNullException("source"); while ((line = source.ReadLine()) != null) { yield return line; } } } class Program { static void Main(string[] args) { StreamReader sr = new StreamReader("People.txt"); XStreamingElement xmlTree = new XStreamingElement("Root", from line in sr.Lines() let items = line.Split(',') where !line.StartsWith("#") select new XElement("Person", new XAttribute("ID", items[0]), new XElement("First", items[1]), new XElement("Last", items[2]), new XElement("Occupation", items[3]) ) ); Console.WriteLine(xmlTree); sr.Close(); } }
この例を実行すると、次の出力が生成されます。
<Root>
<Person ID="1">
<First>Tai</First>
<Last>Yee</Last>
<Occupation>Writer</Occupation>
</Person>
<Person ID="2">
<First>Nikolay</First>
<Last>Grachev</Last>
<Occupation>Programmer</Occupation>
</Person>
<Person ID="3">
<First>David</First>
<Last>Wright</Last>
<Occupation>Inventor</Occupation>
</Person>
</Root>
大きな XML ファイルを変換したり、メモリ使用量が予測できるアプリケーションを作成したりすることが必要な場合があります。 非常に大きな XML ファイルで XML ツリーを作成する場合、メモリ使用量はファイル サイズに比例します (つまり、大量のメモリが消費されます)。 このため、代わりにストリームの手法を使う必要があります。
OrderBy などの特定の標準クエリ演算子は、ソースの反復処理、すべてのデータの収集、およびその並べ替えを行い、最終的にシーケンスの最初の項目を生成します。 最初の項目を生成する前にソースを実体化するクエリ演算子を使用する場合、アプリケーションのメモリ使用量を抑えられないことに注意してください。
「How to: Stream XML Fragments with Access to Header Info」で説明されている手法を使用しても、変換されたドキュメントが含まれている XML ツリーをアセンブルする場合は、メモリ使用量が非常に大きくなることがあります。
次の例は「方法 : ヘッダー情報にアクセスして XML フラグメントをストリーム出力する」の例に基づいています。
XStreamingElement の遅延実行機能を使って、出力をストリーム処理する例を次に示します。
カスタム軸 (StreamCustomerItem) は特別に記述されたもので、Customer、Name、および Item の各要素が含まれているドキュメントが必要であることに注意してください。また、これらの要素は次の Source.xml ドキュメントと同様に配置される必要があります。 ただし、より信頼性の高い実装を実現するには、XSD を使ってソース ドキュメントを検証すること、または無効なドキュメントの解析をできるようにしておくことが必要です。
次に示すのは、ソース ドキュメントである Source.xml です。
<?xml version="1.0" encoding="utf-8" ?>
<Root>
<Customer>
<Name>A. Datum Corporation</Name>
<Item>
<Key>0001</Key>
</Item>
<Item>
<Key>0002</Key>
</Item>
<Item>
<Key>0003</Key>
</Item>
<Item>
<Key>0004</Key>
</Item>
</Customer>
<Customer>
<Name>Fabrikam, Inc.</Name>
<Item>
<Key>0005</Key>
</Item>
<Item>
<Key>0006</Key>
</Item>
<Item>
<Key>0007</Key>
</Item>
<Item>
<Key>0008</Key>
</Item>
</Customer>
<Customer>
<Name>Southridge Video</Name>
<Item>
<Key>0009</Key>
</Item>
<Item>
<Key>0010</Key>
</Item>
</Customer>
</Root>
次のコードには、XmlReader を使ってソース XML をストリーム処理するメソッドが含まれています。 ここでは、XStreamingElement を使って新しい XML をストリーム処理します。
メモ |
|---|
C# の yield return コンストラクトを使用する例を次に示します。 Visual Basic 2008 にはこれに相当する機能がないため、この例の対象は C# のみとなります。 |
static IEnumerable<XElement> StreamCustomerItem(string uri) { using (XmlReader reader = XmlReader.Create(uri)) { XElement name = null; XElement item = null; reader.MoveToContent(); // Parse the file, save header information when encountered, and yield the // Item XElement objects as they are created. // loop through Customer elements while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Customer") { // move to Name element while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Name") { name = XElement.ReadFrom(reader) as XElement; break; } } // loop through Item elements while (reader.Read()) { if (reader.NodeType == XmlNodeType.EndElement) break; if (reader.NodeType == XmlNodeType.Element && reader.Name == "Item") { item = XElement.ReadFrom(reader) as XElement; if (item != null) { XElement tempRoot = new XElement("Root", new XElement(name) ); tempRoot.Add(item); yield return item; } } } } } } } static void Main(string[] args) { XStreamingElement root = new XStreamingElement("Root", from el in StreamCustomerItem("Source.xml") select new XElement("Item", new XElement("Customer", (string)el.Parent.Element("Name")), new XElement(el.Element("Key")) ) ); root.Save("Test.xml"); Console.WriteLine(File.ReadAllText("Test.xml")); }
この例を実行すると、次の出力が生成されます。
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Item>
<Customer>A. Datum Corporation</Customer>
<Key>0001</Key>
</Item>
<Item>
<Customer>A. Datum Corporation</Customer>
<Key>0002</Key>
</Item>
<Item>
<Customer>A. Datum Corporation</Customer>
<Key>0003</Key>
</Item>
<Item>
<Customer>A. Datum Corporation</Customer>
<Key>0004</Key>
</Item>
<Item>
<Customer>Fabrikam, Inc.</Customer>
<Key>0005</Key>
</Item>
<Item>
<Customer>Fabrikam, Inc.</Customer>
<Key>0006</Key>
</Item>
<Item>
<Customer>Fabrikam, Inc.</Customer>
<Key>0007</Key>
</Item>
<Item>
<Customer>Fabrikam, Inc.</Customer>
<Key>0008</Key>
</Item>
<Item>
<Customer>Southridge Video</Customer>
<Key>0009</Key>
</Item>
<Item>
<Customer>Southridge Video</Customer>
<Key>0010</Key>
</Item>
</Root>
Windows 7, Windows Vista SP1 以降, Windows XP SP3, Windows Server 2008 (Server Core はサポート対象外), Windows Server 2008 R2 (SP1 以降で Server Core をサポート), Windows Server 2003 SP2
.NET Framework では、各プラットフォームのすべてのバージョンはサポートしていません。 サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。
