この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

XStreamingElement クラス

 

公開日: 2016年11月

遅延ストリーム出力をサポートする XML ツリー内の要素を表します。

名前空間:   System.Xml.Linq
アセンブリ:  System.Xml.Linq (System.Xml.Linq.dll 内)

System.Object
  System.Xml.Linq.XStreamingElement

public class XStreamingElement

名前説明
System_CAPS_pubmethodXStreamingElement(XName)

指定した XName から XElement クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodXStreamingElement(XName, Object)

新しいインスタンスを初期化、 XStreamingElement 指定した名前と内容を持つクラス。

System_CAPS_pubmethodXStreamingElement(XName, Object[])

新しいインスタンスを初期化、 XStreamingElement 指定した名前と内容を持つクラス。

名前説明
System_CAPS_pubpropertyName

取得またはこのストリームの要素の名前を設定します。

名前説明
System_CAPS_pubmethodAdd(Object)

これを子として指定した内容を追加 XStreamingElementします。

System_CAPS_pubmethodAdd(Object[])

これを子として指定した内容を追加 XStreamingElementします。

System_CAPS_pubmethodEquals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。(Object から継承されます。)

System_CAPS_protmethodFinalize()

オブジェクトが、ガベージ コレクションによって収集される前に、リソースの解放とその他のクリーンアップ操作の実行を試みることができるようにします。(Object から継承されます。)

System_CAPS_pubmethodGetHashCode()

既定のハッシュ関数として機能します。(Object から継承されます。)

System_CAPS_pubmethodGetType()

現在のインスタンスの Type を取得します。(Object から継承されます。)

System_CAPS_protmethodMemberwiseClone()

現在の Object の簡易コピーを作成します。(Object から継承されます。)

System_CAPS_pubmethodSave(Stream)

これは出力 XStreamingElement を指定した Streamします。

System_CAPS_pubmethodSave(Stream, SaveOptions)

これは出力 XStreamingElement を指定した Stream, をオプションで指定して書式指定動作します。

System_CAPS_pubmethodSave(String)

このストリームの要素をファイルにシリアル化します。

System_CAPS_pubmethodSave(String, SaveOptions)

このストリームの要素をオプションで書式設定を無効にし、ファイルにシリアル化します。

System_CAPS_pubmethodSave(TextWriter)

このストリーミングの要素をシリアル化、 TextWriterです。

System_CAPS_pubmethodSave(TextWriter, SaveOptions)

このストリーミングの要素をシリアル化、 TextWriter, 、書式設定オプションで無効にします。

System_CAPS_pubmethodSave(XmlWriter)

このストリーミングの要素をシリアル化、 XmlWriterです。

System_CAPS_pubmethodToString()

このストリーミングの要素の書式設定 (インデント) XML を返します。(Object.ToString() をオーバーライドします。)

System_CAPS_pubmethodToString(SaveOptions)

オプションで書式設定を無効にするこのストリーミングの要素の XML を返します。

System_CAPS_pubmethodWriteTo(XmlWriter)

このストリーミングの要素を書き込み、 XmlWriterです。

このクラスを使用すると、遅延ストリーム出力をサポートする XML ツリーを作成できます。 このクラスを使用して、使用して XML ツリーの作成によく似た方法で XML ツリーを作成する XElementです。 ただし、基本的な違いがあります。 使用してツリーの XML を作成するときにコンテンツを指定する LINQ クエリを使用する場合 XElement, 、XML ツリーの構築時に、クエリ変数が反復処理およびクエリの結果を XML ツリーに追加します。 これに対し、作成する場合、XML ツリーを使用して XStreamingElement, 、反復処理することがなく、XML ツリー内のクエリ変数への参照が格納されています。 シリアル化時にのみクエリの反復処理を実行します。 これにより、メモリ専有を維持しながらより大きな XML ツリーを作成することができます。

コード型のテキスト ファイルなどの入力ソースからストリーミング配信している場合、非常に大きなテキスト ファイルを読んだりわずかなメモリ量を維持しながら非常に大きな XML ドキュメントを生成したりできます。

別のシナリオは、大きい XML ツリーをメモリに読み込まれてがあり、そのドキュメントの変換後のバージョンを作成するにです。 使用して新しいドキュメントを作成する場合 XElement, 、変換の完了時にメモリに 2 つの大きな XML ツリーがされます。 ただし、新しい XML ツリーを使用して、作成した場合 XStreamingElement, 、ワーキング セットは実質的に半分にカットされます。

使用するプログラムをデバッグするときに注意してください XStreamingElement, 、オブジェクトの値を表示すると、その ToString メソッドが呼び出されます。 これにより、シリアル化する XML です。 ストリームの要素は、1 回だけストリームできるという形式のストリーミング要素クエリの場合、デバッグ時に望ましくない動作が発生する可能性があります。

次の例は、まず、ソース XML ツリーを作成します。 使用してソース XML ツリーの変換を作成し XElementします。 この変換は、メモリ内の新しいツリーを作成します。 使用してソース XML ツリーの変換を作成し XStreamingElementします。 この変換は、変換後のツリーをコンソールにシリアル化されるまで、クエリを実行しません。 メモリ使用量が少ないです。


                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

次のコードには、このテキスト ファイルの行を遅延方式でストリーム出力する拡張メソッドが含まれています。


                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<TSource, TKey> などの一部の標準クエリ演算子では、ソースが反復処理され、すべてのデータが収集され並べ替えられて、最終的にはシーケンス内の最初の項目が生成されます。 最初の項目を生成する前にソースを具体化するクエリ演算子を使用すると、アプリケーションのメモリ使用量を低く維持することができないので注意してください。

変換されたドキュメントが含まれる XML ツリーをアセンブルしようとする場合で説明したテクニックを使用する場合でもメモリ使用量が非常に高い場合があります。

How to: Stream XML Fragments with Access to Header Information」の例を基に構築した例を次に示します。

この例では、XStreamingElement の遅延実行機能を使用してストリーム出力しています。

カスタム軸 (StreamCustomerItem) は、CustomerNameItem の各要素を含んだドキュメントを前提として記述されています。また、それらの要素は、次に示す 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 をストリーム配信します。


                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 プラットフォーム
8 以降で使用可能
.NET Framework
3.5 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
2.0 以降で使用可能
Windows Phone Silverlight
7.0 以降で使用可能
Windows Phone
8.1 以降で使用可能

この型のパブリック static (Visual Basic では Shared ) メンバーはスレッド セーフです。インスタンス メンバーの場合は、スレッド セーフであるとは限りません。

トップに戻る
表示: