XStreamingElement XStreamingElement XStreamingElement XStreamingElement Class

定義

遅延ストリーム出力をサポートする XML ツリー内の要素を表します。Represents elements in an XML tree that supports deferred streaming output.

public ref class XStreamingElement
public class XStreamingElement
type XStreamingElement = class
Public Class XStreamingElement
継承
XStreamingElementXStreamingElementXStreamingElementXStreamingElement

次の例では、最初にソース XML ツリーを作成します。The following example first creates a source XML tree. 次に、を使用してXElement、ソース XML ツリーの変換を作成します。It then creates a transform of the source XML tree using XElement. この変換では、メモリ内に新しいツリーが作成されます。This transform creates a new tree in memory. 次に、を使用してXStreamingElement、ソース XML ツリーの変換を作成します。It then creates a transform of the source XML tree using XStreamingElement. この変換は、変換されたツリーがコンソールにシリアル化されるまで、クエリを実行しません。This transform doesn't execute the query until the transformed tree is serialized to the console. メモリ使用量が少なくなっています。Its memory usage is less.

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);  
Dim srcTree As XElement = _  
        <Root>  
            <Child>1</Child>  
            <Child>2</Child>  
            <Child>3</Child>  
            <Child>4</Child>  
            <Child>5</Child>  
        </Root>  

Dim dstTree1 As XElement = _  
    <NewRoot>  
        <%= From el In srcTree.Elements _  
            Where (el.Value >= 3) _  
            Select <DifferentChild><%= el.Value %></DifferentChild> %>  
    </NewRoot>  

Dim dstTree2 As XStreamingElement = New XStreamingElement("NewRoot", _  
                From el In srcTree.Elements _  
                Where el.Value >= 3 _  
                Select <DifferentChild><%= el.Value %></DifferentChild> _  
            )  

Console.WriteLine(dstTree1)  
Console.WriteLine("------")  
Console.WriteLine(dstTree2)  

この例を実行すると、次の出力が生成されます。This example produces the following output:

<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 行ずつストリーム出力する拡張メソッドを記述することです。One approach to processing a text file is to write an extension method that streams the text file a line at a time using the yield return construct. その後、テキスト ファイルをレイジー遅延方式で処理する LINQ クエリを記述できます。You then can write a LINQ query that processes the text file in a lazy deferred fashion. 次にを使用しXStreamingElementてストリーム出力する場合は、ソーステキストファイルのサイズに関係なく、最小限のメモリを使用する XML への変換をテキストファイルから作成できます。If you then use the XStreamingElement to stream output, you then can create a transform from the text file to XML that uses a minimal amount of memory, regardless of the size of the source text file.

次のテキスト ファイル (People.txt) は、この例のソースです。The following text file, People.txt, is the source for this example.

#This is a comment  
1,Tai,Yee,Writer  
2,Nikolay,Grachev,Programmer  
3,David,Wright,Inventor  

次のコードには、このテキスト ファイルの行を遅延方式でストリーム出力する拡張メソッドが含まれています。The following code contains an extension method that streams the lines of the text file in a deferred fashion.

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();  
    }  
}  
Module StreamReaderSequence  

    <Runtime.CompilerServices.Extension>  
    Public Iterator Function Lines(source As IO.StreamReader) As IEnumerable(Of String)  
        If source Is Nothing Then Throw New ArgumentNullException("source")  
        Dim line As String = source.ReadLine()  
        While (line <> Nothing)  
            Yield line  
            line = source.ReadLine()  
        End While  
    End Function  

End Module  

Module Module1  
    Sub Main()  
        Dim sr As New IO.StreamReader("People.txt")  
        Dim xmlTree As New XStreamingElement("Root",  
            From line In sr.Lines()  
            Let items = line.Split(","c)  
            Where Not line.StartsWith("#")  
            Select <Person ID=<%= items(0) %>>  
                       <First><%= items(1) %></First>  
                       <Last><%= items(2) %></Last>  
                       <Occupation><%= items(3) %></Occupation>  
                   </Person>)  
        Console.WriteLine(xmlTree)  
        sr.Close()  
    End Sub  
End Module  

この例を実行すると、次の出力が生成されます。This example produces the following output:

<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 ファイルを変換して、アプリケーションのメモリ使用量を予想できるようにアプリケーションを作成しなければならない場合があります。Sometimes you have to transform large XML files, and write your application so that the memory footprint of the application is predictable. 非常に大きな XML ファイルを XML ツリーに設定しようとすると、ファイルのサイズに比例してメモリが過剰に使用されます。If you try to populate an XML tree with a very large XML file, your memory usage will be proportional to the size of the file (that is, excessive). したがって、代わりにストリーミングの手法を使用する必要があります。Therefore, you should use a streaming technique instead.

OrderBy などの一部の標準クエリ演算子では、ソースが反復処理され、すべてのデータが収集され並べ替えられて、最終的にはシーケンス内の最初の項目が生成されます。Certain standard query operators, such as OrderBy, iterate their source, collect all of the data, sort it, and then finally yield the first item in the sequence. 最初の項目を生成する前にソースを具体化するクエリ演算子を使用すると、アプリケーションのメモリ使用量を低く維持することができないので注意してください。Note that if you use a query operator that materializes its source before yielding the first item, you will not retain a small memory footprint for your application.

「」で説明されている手法を使用する場合でも、変換されたドキュメントを含む XML ツリーをアセンブルしようとすると、メモリ使用量が非常に大きくなることがあります。Even if you use the technique described in , if you try to assemble an XML tree that contains the transformed document, memory usage may be too great.

次の例は、「方法: ヘッダー情報へのアクセス権を持つ XML フラグメントをストリームします。The following example builds on the example in How to: Stream XML Fragments with Access to Header Information.

この例では、XStreamingElement の遅延実行機能を使用してストリーム出力しています。This example uses the deferred execution capabilities of XStreamingElement to stream the output.

カスタム軸 (StreamCustomerItem) は、CustomerNameItem の各要素を含んだドキュメントを前提として記述されています。また、それらの要素は、次に示す Source.xml ドキュメントと同じように配置されます。Note that the custom axis (StreamCustomerItem) is specifically written so that it expects a document that has Customer, Name, and Item elements, and that those elements will be arranged as in the following Source.xml document. ただし、より堅牢に実装する場合は、ソース ドキュメントを XSD で検証するか、無効なドキュメントの解析にも対応するようにします。A more robust implementation, however, would either validate the source document with an XSD, or would be prepared to parse an invalid document.

ソース ドキュメント Source.xml を次に示します。The following is the source document, 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 をストリームするメソッドが含まれています。The following code contains a method that uses an XmlReader to stream the source XML. 新しい XML XStreamingElementをストリーム配信するためにを使用します。It uses XStreamingElement to stream the new 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"));  
}  
Iterator Function StreamCustomerItem(uri As String) As IEnumerable(Of XElement)  

    Dim name As XElement = Nothing  
    Dim item As XElement = Nothing  

    Dim reader As XmlReader = XmlReader.Create(uri)  
    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 And reader.Name = "Customer") Then  
            While (reader.Read())  
                ' Move to Name element  
                If (reader.NodeType = XmlNodeType.Element And reader.Name = "Name") Then  
                    name = CType(XElement.ReadFrom(reader), XElement)  
                    Exit While  
                End If  
            End While  

            ' Loop through Item elements  
            While (reader.Read())  
                If (reader.NodeType = XmlNodeType.EndElement) Then  
                    Exit While  
                End If  

                If (reader.NodeType = XmlNodeType.Element And reader.Name = "Item") Then  
                    item = CType(XElement.ReadFrom(reader), XElement)  
                    If (Not (item Is Nothing)) Then  
                        Dim tempRoot = New XElement("Root",  
                            New XElement(name)  
                        )  
                        tempRoot.Add(item)  
                        Yield item  
                     End If  
                End If  
            End While  
        End If  
     End While  
    reader.Close()  
End Function  

Sub Main()  
    Dim root As New XStreamingElement("Root",  
        From el In StreamCustomerItem("c:\trash\Source.xml")  
        Select New XElement("Item",  
            New XElement("Customer", CStr(el.Parent.Element("Name"))),  
            New XElement(el.Element("Key"))))  
    root.Save("c:\trash\Test.xml")  
    Console.WriteLine(System.IO.File.ReadAllText("c:\trash\Test.xml"))  
End Sub  

この例を実行すると、次の出力が生成されます。This example produces the following output:

<?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>  

注釈

このクラスを使用すると、遅延ストリーミング出力をサポートする XML ツリーを作成できます。This class allows you to create an XML tree that supports deferred streaming output. このクラスを使用すると、を使用してXElementxml ツリーを作成するのとよく似た方法で xml ツリーを作成できます。You use this class to create an XML tree in a very similar fashion to creating an XML tree using XElement. ただし、基本的な違いがあります。However, there is a fundamental difference. を使用して xml ツリーを作成するときに、LINQ クエリをXElement使用してコンテンツを指定すると、xml ツリーの構築時にクエリ変数が反復処理され、クエリの結果が xml ツリーに追加されます。When you use a LINQ query to specify content when creating an XML tree using XElement, the query variable is iterated at the time of construction of the XML tree, and the results of the query are added to the XML tree. これに対して、を使用してXStreamingElementxml ツリーを作成する場合、クエリ変数への参照は、反復処理されることなく xml ツリーに格納されます。In contrast, when you create an XML tree using XStreamingElement, a reference to the query variable is stored in the XML tree without being iterated. クエリは、シリアル化時にのみ反復処理されます。Queries are iterated only upon serialization. これにより、より大きな XML ツリーを作成しながら、メモリフットプリントを小さくすることができます。This allows you to create larger XML trees while maintaining a smaller memory footprint.

テキストファイルなどの入力ソースからストリーミングする場合、非常に大きなテキストファイルを読み取り、非常に大きな XML ドキュメントを生成しながら、メモリフットプリントを小さくすることができます。If you are streaming from an input source, such as a text file, then you can read a very large text file, and generate a very large XML document while maintaining a small memory footprint.

もう1つのシナリオは、メモリに読み込まれている大きな XML ツリーがあり、変換されたバージョンのドキュメントを作成することです。Another scenario is that you have a large XML tree that has been loaded into memory, and you want to create a transformed version of the document. を使用してXElement新しいドキュメントを作成すると、変換の完了時に2つの大きな XML ツリーがメモリに作成されます。If you create a new document using XElement, then you will have two large XML trees in memory upon completion of the transformation. ただし、を使用してXStreamingElement新しい XML ツリーを作成した場合、ワーキングセットは実質的に半分に短縮されます。However, if you create the new XML tree using XStreamingElement, then your working set will be effectively cut in half.

を使用XStreamingElementするプログラムをデバッグするときに、オブジェクトToStringの値を表示するとメソッドが呼び出されることに注意してください。Note that when debugging a program that uses XStreamingElement, displaying the value of an object causes its ToString method to be called. これにより、XML がシリアル化されます。This causes the XML to be serialized. Streaming 要素のクエリのセマンティクスが、ストリーミング要素を1回だけストリーミングできるようになっている場合は、デバッグ環境で望ましくない動作が発生する可能性があります。If the semantics of your streaming element query are such that the streaming element can only be streamed once, this may cause undesirable behavior in your debugging experience.

コンストラクター

XStreamingElement(XName) XStreamingElement(XName) XStreamingElement(XName) XStreamingElement(XName)

指定した XElement から XName クラスの新しいインスタンスを初期化します。Initializes a new instance of the XElement class from the specified XName.

XStreamingElement(XName, Object) XStreamingElement(XName, Object) XStreamingElement(XName, Object) XStreamingElement(XName, Object)

指定した名前と内容を持つ XStreamingElement クラスの新しいインスタンスを初期化します。Initializes a new instance of the XStreamingElement class with the specified name and content.

XStreamingElement(XName, Object[]) XStreamingElement(XName, Object[]) XStreamingElement(XName, Object[]) XStreamingElement(XName, Object[])

指定した名前と内容を持つ XStreamingElement クラスの新しいインスタンスを初期化します。Initializes a new instance of the XStreamingElement class with the specified name and content.

プロパティ

Name Name Name Name

このストリーム要素の名前を取得または設定します。Gets or sets the name of this streaming element.

メソッド

Add(Object) Add(Object) Add(Object) Add(Object)

指定した内容をこの XStreamingElement に子として追加します。Adds the specified content as children to this XStreamingElement.

Add(Object[]) Add(Object[]) Add(Object[]) Add(Object[])

指定した内容をこの XStreamingElement に子として追加します。Adds the specified content as children to this XStreamingElement.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(Inherited from Object)
Save(Stream) Save(Stream) Save(Stream) Save(Stream)

この XStreamingElement を指定した Stream に出力します。Outputs this XStreamingElement to the specified Stream.

Save(Stream, SaveOptions) Save(Stream, SaveOptions) Save(Stream, SaveOptions) Save(Stream, SaveOptions)

オプションで書式設定動作を指定して、指定した Stream にこの XStreamingElement を出力します。Outputs this XStreamingElement to the specified Stream, optionally specifying formatting behavior.

Save(String) Save(String) Save(String) Save(String)

このストリーム要素をシリアル化してファイルに書き込みます。Serialize this streaming element to a file.

Save(String, SaveOptions) Save(String, SaveOptions) Save(String, SaveOptions) Save(String, SaveOptions)

このストリーム要素をシリアル化してファイルに書き込み、必要に応じて、書式設定を無効にします。Serialize this streaming element to a file, optionally disabling formatting.

Save(TextWriter) Save(TextWriter) Save(TextWriter) Save(TextWriter)

このストリーム要素をシリアル化して TextWriter に書き込みます。Serialize this streaming element to a TextWriter.

Save(TextWriter, SaveOptions) Save(TextWriter, SaveOptions) Save(TextWriter, SaveOptions) Save(TextWriter, SaveOptions)

このストリーム要素をシリアル化して TextWriter に書き込み、必要に応じて、書式設定を無効にします。Serialize this streaming element to a TextWriter, optionally disabling formatting.

Save(XmlWriter) Save(XmlWriter) Save(XmlWriter) Save(XmlWriter)

このストリーム要素をシリアル化して XmlWriter に書き込みます。Serialize this streaming element to an XmlWriter.

ToString() ToString() ToString() ToString()

このストリーム要素に対して書式 (インデント) が設定された XML を返します。Returns the formatted (indented) XML for this streaming element.

ToString(SaveOptions) ToString(SaveOptions) ToString(SaveOptions) ToString(SaveOptions)

このストリーム要素に対して XML を返し、必要に応じて、書式設定を無効にします。Returns the XML for this streaming element, optionally disabling formatting.

WriteTo(XmlWriter) WriteTo(XmlWriter) WriteTo(XmlWriter) WriteTo(XmlWriter)

このストリーム要素を XmlWriter に書き込みます。Writes this streaming element to an XmlWriter.

適用対象

こちらもご覧ください