diff --git a/docs/standard/linq/perform-streaming-transform-large-xml-documents.md b/docs/standard/linq/perform-streaming-transform-large-xml-documents.md index 2934d392d4abe..7449e6eb40a11 100644 --- a/docs/standard/linq/perform-streaming-transform-large-xml-documents.md +++ b/docs/standard/linq/perform-streaming-transform-large-xml-documents.md @@ -76,54 +76,50 @@ The following is the source document, Source.xml: ```csharp static IEnumerable StreamCustomerItem(string uri) { - using (XmlReader reader = XmlReader.Create(uri)) - { - XElement name = null; - XElement item = null; + using XmlReader reader = XmlReader.Create(uri); + + reader.MoveToContent(); - reader.MoveToContent(); + // Parse the file, save header information when encountered, and yield the + // Item XElement objects as they're created. - // Parse the file, save header information when encountered, and yield the - // Item XElement objects as they're created. - // Loop through Customer elements. - while (reader.Read()) + // Loop through Customer elements + do + { + if (reader.NodeType == XmlNodeType.Element && reader.Name == "Customer") { - if (reader.NodeType == XmlNodeType.Element - && reader.Name == "Customer") + // Move to Name element + XElement? name = null; + do { - // move to Name element - while (reader.Read()) + if (reader.NodeType == XmlNodeType.Element && reader.Name == "Name") { - if (reader.NodeType == XmlNodeType.Element && - reader.Name == "Name") - { - name = XElement.ReadFrom(reader) as XElement; - break; - } + name = XNode.ReadFrom(reader) as XElement; + break; } + } + while (reader.Read()); - // loop through Item elements - while (reader.Read()) + // Loop through Item elements + while (reader.NodeType != XmlNodeType.EndElement) + { + if (reader.NodeType == XmlNodeType.Element && reader.Name == "Item") { - if (reader.NodeType == XmlNodeType.EndElement) - break; - if (reader.NodeType == XmlNodeType.Element - && reader.Name == "Item") + if (XNode.ReadFrom(reader) is XElement item && name != null) { - item = XElement.ReadFrom(reader) as XElement; - if (item != null) - { - XElement tempRoot = new XElement("Root", - new XElement(name) - ); - tempRoot.Add(item); - yield return item; - } + XElement tempRoot = new XElement("Root", + new XElement(name), + item + ); + yield return item; } } + else if (!reader.Read()) + break; } } } + while (reader.Read()); } static void Main(string[] args) @@ -141,128 +137,79 @@ static void Main(string[] args) ``` ```vb +Imports System.IO +Imports System.Xml + Module Module1 - Sub Main() - Dim root = New XStreamingElement("Root", - From el In New StreamCustomerItem("Source.xml") - Select - <%= el.Parent..Value %> - <%= el. %> - - ) - root.Save("Test.xml") - Console.WriteLine(My.Computer.FileSystem.ReadAllText("Test.xml")) - End Sub -End Module -Public Class StreamCustomerItem - Implements IEnumerable(Of XElement) + Public Iterator Function StreamCustomerItem(uri As String) As IEnumerable(Of XElement) + Using reader As XmlReader = XmlReader.Create(uri) + reader.MoveToContent() - Private _uri As String + ' Parse the file, save header information when encountered, And yield the + ' Item XElement objects as they're created. - Public Sub New(ByVal uri As String) - _uri = uri - End Sub + ' Loop through Customer elements + Do - Public Function GetEnumerator() As IEnumerator(Of XElement) Implements IEnumerable(Of XElement).GetEnumerator - Return New StreamCustomerItemEnumerator(_uri) - End Function + If reader.NodeType = XmlNodeType.Element And reader.Name = "Customer" Then - Public Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator - Return Me.GetEnumerator() - End Function -End Class + ' Move to Name element + Dim name As XElement = Nothing + Do + If reader.NodeType = XmlNodeType.Element And reader.Name = "Name" Then -Public Class StreamCustomerItemEnumerator - Implements IEnumerator(Of XElement) + name = TryCast(XNode.ReadFrom(reader), XElement) + Exit Do - Private _current As XElement - Private _customerName As String - Private _reader As Xml.XmlReader - Private _uri As String + End If - Public Sub New(ByVal uri As String) - _uri = uri - _reader = Xml.XmlReader.Create(_uri) - _reader.MoveToContent() - End Sub + Loop While reader.Read() + + ' Loop through Item elements + While reader.NodeType <> XmlNodeType.EndElement + + If reader.NodeType = XmlNodeType.Element And reader.Name = "Item" Then + + Dim item = TryCast(XNode.ReadFrom(reader), XElement) + + If name IsNot Nothing AndAlso item IsNot Nothing Then + + Dim tempRoot = + <%= name.Value %> + <%= item %> + + + Yield item - Public ReadOnly Property Current As XElement Implements IEnumerator(Of XElement).Current - Get - Return _current - End Get - End Property - - Public ReadOnly Property Current1 As Object Implements IEnumerator.Current - Get - Return Me.Current - End Get - End Property - - Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext - Dim item As XElement - Dim name As XElement - - ' Parse the file, save header information when encountered, and return the - ' current Item XElement. - - ' loop through Customer elements - While _reader.Read() - If _reader.NodeType = Xml.XmlNodeType.Element Then - Select Case _reader.Name - Case "Customer" - ' move to Name element - While _reader.Read() - - If _reader.NodeType = Xml.XmlNodeType.Element AndAlso - _reader.Name = "Name" Then - - name = TryCast(XElement.ReadFrom(_reader), XElement) - _customerName = If(name IsNot Nothing, name.Value, "") - Exit While End If - End While - Case "Item" - item = TryCast(XElement.ReadFrom(_reader), XElement) - Dim tempRoot = - <%= _customerName %> - <%= item %> - - _current = item - Return True - End Select - End If - End While - - Return False - End Function + ElseIf Not reader.Read() Then + Exit While + End If - Public Sub Reset() Implements IEnumerator.Reset - _reader = Xml.XmlReader.Create(_uri) - _reader.MoveToContent() - End Sub + End While -#Region "IDisposable Support" - Private disposedValue As Boolean ' To detect redundant calls - - ' IDisposable - Protected Overridable Sub Dispose(ByVal disposing As Boolean) - If Not Me.disposedValue Then - If disposing Then - _reader.Close() - End If - End If - Me.disposedValue = True - End Sub + End If + + Loop While reader.Read() - Public Sub Dispose() Implements IDisposable.Dispose - Dispose(True) - GC.SuppressFinalize(Me) + End Using + End Function + + Sub Main() + Dim root = New XStreamingElement("Root", + From el In StreamCustomerItem("Source.xml") + Select + <%= el.Parent..Value %> + <%= el. %> + + ) + root.Save("Test.xml") + Console.WriteLine(File.ReadAllText("Test.xml")) End Sub -#End Region -End Class +End Module ``` This example produces the following output: @@ -328,53 +275,50 @@ Using for streaming the output XML is p ```csharp static IEnumerable StreamCustomerItem(string uri) { - using (XmlReader reader = XmlReader.Create(uri)) - { - XElement name = null; - XElement item = null; + using XmlReader reader = XmlReader.Create(uri); - reader.MoveToContent(); + reader.MoveToContent(); - // Parse the file, save header information when encountered, and yield the - // Item XElement objects as they're created. - // Loop through Customer elements. - while (reader.Read()) + // Parse the file, save header information when encountered, and yield the + // Item XElement objects as they're created. + + // Loop through Customer elements + do + { + if (reader.NodeType == XmlNodeType.Element && reader.Name == "Customer") { - if (reader.NodeType == XmlNodeType.Element - && reader.Name == "Customer") + // Move to Name element + XElement? name = null; + do { - // move to Name element - while (reader.Read()) + if (reader.NodeType == XmlNodeType.Element && reader.Name == "Name") { - if (reader.NodeType == XmlNodeType.Element && - reader.Name == "Name") - { - name = XElement.ReadFrom(reader) as XElement; - break; - } + name = XNode.ReadFrom(reader) as XElement; + break; } + } + while (reader.Read()); - // Loop through Item elements - while (reader.Read()) + // Loop through Item elements + while (reader.NodeType != XmlNodeType.EndElement) + { + if (reader.NodeType == XmlNodeType.Element && reader.Name == "Item") { - if (reader.NodeType == XmlNodeType.EndElement) - break; - if (reader.NodeType == XmlNodeType.Element - && reader.Name == "Item") + if (XNode.ReadFrom(reader) is XElement item && name != null) { - item = XElement.ReadFrom(reader) as XElement; - if (item != null) { - XElement tempRoot = new XElement("Root", - new XElement(name) - ); - tempRoot.Add(item); - yield return item; - } + XElement tempRoot = new XElement("Root", + new XElement(name), + item + ); + yield return item; } } + else if (!reader.Read()) + break; } } } + while (reader.Read()); } static void Main(string[] args) @@ -401,10 +345,69 @@ static void Main(string[] args) ``` ```vb +Imports System.IO +Imports System.Xml + Module Module1 + + Public Iterator Function StreamCustomerItem(uri As String) As IEnumerable(Of XElement) + Using reader As XmlReader = XmlReader.Create(uri) + reader.MoveToContent() + + ' Parse the file, save header information when encountered, And yield the + ' Item XElement objects as they're created. + + ' Loop through Customer elements + Do + + If reader.NodeType = XmlNodeType.Element And reader.Name = "Customer" Then + + ' Move to Name element + Dim name As XElement = Nothing + Do + If reader.NodeType = XmlNodeType.Element And reader.Name = "Name" Then + + name = TryCast(XNode.ReadFrom(reader), XElement) + Exit Do + + End If + + Loop While reader.Read() + + ' Loop through Item elements + While reader.NodeType <> XmlNodeType.EndElement + + If reader.NodeType = XmlNodeType.Element And reader.Name = "Item" Then + + Dim item = TryCast(XNode.ReadFrom(reader), XElement) + + If name IsNot Nothing AndAlso item IsNot Nothing Then + + Dim tempRoot = + <%= name.Value %> + <%= item %> + + + Yield item + + End If + + ElseIf Not reader.Read() Then + Exit While + End If + + End While + + End If + + Loop While reader.Read() + + End Using + End Function + Sub Main() Dim srcTree = - From el In New StreamCustomerItem("Source.xml") + From el In StreamCustomerItem("Source.xml") Select <%= el.Parent..Value %> <%= el. %> @@ -421,119 +424,11 @@ Module Module1 xw.WriteEndElement() End Using - Dim s = My.Computer.FileSystem.ReadAllText("Output.xml") + Dim s = File.ReadAllText("Output.xml") Console.WriteLine(s) End Sub -End Module - -Public Class StreamCustomerItem - Implements IEnumerable(Of XElement) - - Private _uri As String - - Public Sub New(ByVal uri As String) - _uri = uri - End Sub - - Public Function GetEnumerator() As IEnumerator(Of XElement) Implements IEnumerable(Of XElement).GetEnumerator - Return New StreamCustomerItemEnumerator(_uri) - End Function - - Public Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator - Return Me.GetEnumerator() - End Function -End Class - -Public Class StreamCustomerItemEnumerator - Implements IEnumerator(Of XElement) - - Private _current As XElement - Private _customerName As String - Private _reader As Xml.XmlReader - Private _uri As String - - Public Sub New(ByVal uri As String) - _uri = uri - _reader = Xml.XmlReader.Create(_uri) - _reader.MoveToContent() - End Sub - - Public ReadOnly Property Current As XElement Implements IEnumerator(Of XElement).Current - Get - Return _current - End Get - End Property - - Public ReadOnly Property Current1 As Object Implements IEnumerator.Current - Get - Return Me.Current - End Get - End Property - - Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext - Dim item As XElement - Dim name As XElement - - ' Parse the file, save header information when encountered, and return the - ' current Item XElement. - - ' loop through Customer elements - While _reader.Read() - If _reader.NodeType = Xml.XmlNodeType.Element Then - Select Case _reader.Name - Case "Customer" - ' move to Name element - While _reader.Read() - - If _reader.NodeType = Xml.XmlNodeType.Element AndAlso - _reader.Name = "Name" Then - - name = TryCast(XElement.ReadFrom(_reader), XElement) - _customerName = If(name IsNot Nothing, name.Value, "") - Exit While - End If - - End While - Case "Item" - item = TryCast(XElement.ReadFrom(_reader), XElement) - Dim tempRoot = - <%= _customerName %> - <%= item %> - - _current = item - Return True - End Select - End If - End While - - Return False - End Function - - Public Sub Reset() Implements IEnumerator.Reset - _reader = Xml.XmlReader.Create(_uri) - _reader.MoveToContent() - End Sub - -#Region "IDisposable Support" - Private disposedValue As Boolean ' To detect redundant calls - - ' IDisposable - Protected Overridable Sub Dispose(ByVal disposing As Boolean) - If Not Me.disposedValue Then - If disposing Then - _reader.Close() - End If - End If - Me.disposedValue = True - End Sub - Public Sub Dispose() Implements IDisposable.Dispose - Dispose(True) - GC.SuppressFinalize(Me) - End Sub -#End Region - -End Class +End Module ``` This example produces the following output: diff --git a/docs/standard/linq/stream-xml-fragments-access-header-information.md b/docs/standard/linq/stream-xml-fragments-access-header-information.md index dd732daf6886b..259e977e7a1d3 100644 --- a/docs/standard/linq/stream-xml-fragments-access-header-information.md +++ b/docs/standard/linq/stream-xml-fragments-access-header-information.md @@ -76,54 +76,50 @@ The following example shows how to implement and use a custom axis method that s ```csharp static IEnumerable StreamCustomerItem(string uri) { - using (XmlReader reader = XmlReader.Create(uri)) - { - XElement name = null; - XElement item = null; + using XmlReader reader = XmlReader.Create(uri); - reader.MoveToContent(); + reader.MoveToContent(); - // Parse the file, save header information when encountered, and yield the - // Item XElement objects as they're created. + // Parse the file, save header information when encountered, and yield the + // Item XElement objects as they're created. - // loop through Customer elements - while (reader.Read()) + // Loop through Customer elements + do + { + if (reader.NodeType == XmlNodeType.Element && reader.Name == "Customer") { - if (reader.NodeType == XmlNodeType.Element - && reader.Name == "Customer") + // Move to Name element + XElement? name = null; + do { - // move to Name element - while (reader.Read()) + if (reader.NodeType == XmlNodeType.Element && reader.Name == "Name") { - if (reader.NodeType == XmlNodeType.Element && - reader.Name == "Name") - { - name = XElement.ReadFrom(reader) as XElement; - break; - } + name = XNode.ReadFrom(reader) as XElement; + break; } + } + while (reader.Read()); - // Loop through Item elements - while (reader.Read()) + // Loop through Item elements + while (reader.NodeType != XmlNodeType.EndElement) + { + if (reader.NodeType == XmlNodeType.Element && reader.Name == "Item") { - if (reader.NodeType == XmlNodeType.EndElement) - break; - if (reader.NodeType == XmlNodeType.Element - && reader.Name == "Item") + if (XNode.ReadFrom(reader) is XElement item && name != null) { - item = XElement.ReadFrom(reader) as XElement; - if (item != null) { - XElement tempRoot = new XElement("Root", - new XElement(name) - ); - tempRoot.Add(item); - yield return item; - } + XElement tempRoot = new XElement("Root", + new XElement(name), + item + ); + yield return item; } } + else if (!reader.Read()) + break; } } } + while (reader.Read()); } static void Main(string[] args) @@ -141,134 +137,82 @@ static void Main(string[] args) ``` ```vb +Imports System.Xml + Module Module1 - Sub Main() - Dim xmlTree = - <%= - From el In New StreamCustomerItem("Source.xml") - Let itemKey = CInt(el..Value) - Where itemKey >= 3 AndAlso itemKey <= 7 - Select - <%= el.Parent..Value %> - <%= el. %> - - %> - + Public Iterator Function StreamCustomerItem(uri As String) As IEnumerable(Of XElement) + Using reader As XmlReader = XmlReader.Create(uri) + reader.MoveToContent() - Console.WriteLine(xmlTree) - End Sub + ' Parse the file, save header information when encountered, And yield the + ' Item XElement objects as they're created. -End Module + ' Loop through Customer elements + Do -Public Class StreamCustomerItem - Implements IEnumerable(Of XElement) + If reader.NodeType = XmlNodeType.Element And reader.Name = "Customer" Then - Private _uri As String + ' Move to Name element + Dim name As XElement = Nothing + Do + If reader.NodeType = XmlNodeType.Element And reader.Name = "Name" Then - Public Sub New(ByVal uri As String) - _uri = uri - End Sub + name = TryCast(XNode.ReadFrom(reader), XElement) + Exit Do - Public Function GetEnumerator() As IEnumerator(Of XElement) Implements IEnumerable(Of XElement).GetEnumerator - Return New StreamCustomerItemEnumerator(_uri) - End Function + End If - Public Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator - Return Me.GetEnumerator() - End Function -End Class + Loop While reader.Read() -Public Class StreamCustomerItemEnumerator - Implements IEnumerator(Of XElement) + ' Loop through Item elements + While reader.NodeType <> XmlNodeType.EndElement - Private _current As XElement - Private _customerName As String - Private _reader As Xml.XmlReader - Private _uri As String + If reader.NodeType = XmlNodeType.Element And reader.Name = "Item" Then - Public Sub New(ByVal uri As String) - _uri = uri - _reader = Xml.XmlReader.Create(_uri) - _reader.MoveToContent() - End Sub + Dim item = TryCast(XNode.ReadFrom(reader), XElement) + + If name IsNot Nothing AndAlso item IsNot Nothing Then + + Dim tempRoot = + <%= name.Value %> + <%= item %> + + + Yield item - Public ReadOnly Property Current As XElement Implements IEnumerator(Of XElement).Current - Get - Return _current - End Get - End Property - - Public ReadOnly Property Current1 As Object Implements IEnumerator.Current - Get - Return Me.Current - End Get - End Property - - Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext - Dim item As XElement - Dim name As XElement - - ' Parse the file, save header information when encountered, and return the - ' current Item XElement. - - ' loop through Customer elements - While _reader.Read() - If _reader.NodeType = Xml.XmlNodeType.Element Then - Select Case _reader.Name - Case "Customer" - ' move to Name element - While _reader.Read() - - If _reader.NodeType = Xml.XmlNodeType.Element AndAlso - _reader.Name = "Name" Then - - name = TryCast(XElement.ReadFrom(_reader), XElement) - _customerName = If(name IsNot Nothing, name.Value, "") - Exit While End If - End While - Case "Item" - item = TryCast(XElement.ReadFrom(_reader), XElement) - Dim tempRoot = - <%= _customerName %> - <%= item %> - - _current = item - Return True - End Select - End If - End While - - Return False - End Function + ElseIf Not reader.Read() Then + Exit While + End If - Public Sub Reset() Implements IEnumerator.Reset - _reader = Xml.XmlReader.Create(_uri) - _reader.MoveToContent() - End Sub + End While -#Region "IDisposable Support" - Private disposedValue As Boolean ' To detect redundant calls - - ' IDisposable - Protected Overridable Sub Dispose(ByVal disposing As Boolean) - If Not Me.disposedValue Then - If disposing Then - _reader.Close() - End If - End If - Me.disposedValue = True - End Sub + End If + + Loop While reader.Read() + + End Using + End Function + + Sub Main() + Dim xmlTree = + <%= + From el In StreamCustomerItem("Source.xml") + Let itemKey = CInt(el..Value) + Where itemKey >= 3 AndAlso itemKey <= 7 + Select + <%= el.Parent..Value %> + <%= el. %> + + %> + - Public Sub Dispose() Implements IDisposable.Dispose - Dispose(True) - GC.SuppressFinalize(Me) + Console.WriteLine(xmlTree) End Sub -#End Region -End Class +End Module ``` This code produces the following output: