From 46426a06b2e9bade67106a48d5004c683eef0019 Mon Sep 17 00:00:00 2001 From: Konstantin Lepeshenkov <5447190+scale-tone@users.noreply.github.com> Date: Wed, 1 Jan 2025 17:58:56 +0100 Subject: [PATCH 1/3] fixed code samples in streaming howto --- ...xml-fragments-access-header-information.md | 226 +++++++----------- 1 file changed, 85 insertions(+), 141 deletions(-) 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..6fdc245425376 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: From 3c26a2e273d07f1ede86bef6f567f6aaee5f5d8a Mon Sep 17 00:00:00 2001 From: Konstantin Lepeshenkov <5447190+scale-tone@users.noreply.github.com> Date: Wed, 1 Jan 2025 20:41:05 +0100 Subject: [PATCH 2/3] fixed another sample --- ...streaming-transform-large-xml-documents.md | 461 +++++++----------- 1 file changed, 178 insertions(+), 283 deletions(-) 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..edd7bf4d26a49 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: From 334327d0fe928032c032b784bc02785db321f457 Mon Sep 17 00:00:00 2001 From: "Andy (Steve) De George" <67293991+adegeo@users.noreply.github.com> Date: Tue, 4 Feb 2025 08:31:44 -0800 Subject: [PATCH 3/3] Capitalize comments in XML processing examples --- ...rm-streaming-transform-large-xml-documents.md | 16 ++++++++-------- ...am-xml-fragments-access-header-information.md | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) 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 edd7bf4d26a49..7449e6eb40a11 100644 --- a/docs/standard/linq/perform-streaming-transform-large-xml-documents.md +++ b/docs/standard/linq/perform-streaming-transform-large-xml-documents.md @@ -83,12 +83,12 @@ static IEnumerable StreamCustomerItem(string uri) // Parse the file, save header information when encountered, and yield the // Item XElement objects as they're created. - // loop through Customer elements + // Loop through Customer elements do { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Customer") { - // move to Name element + // Move to Name element XElement? name = null; do { @@ -149,12 +149,12 @@ Module Module1 ' Parse the file, save header information when encountered, And yield the ' Item XElement objects as they're created. - ' loop through Customer elements + ' Loop through Customer elements Do If reader.NodeType = XmlNodeType.Element And reader.Name = "Customer" Then - ' move to Name element + ' Move to Name element Dim name As XElement = Nothing Do If reader.NodeType = XmlNodeType.Element And reader.Name = "Name" Then @@ -282,12 +282,12 @@ static IEnumerable StreamCustomerItem(string uri) // Parse the file, save header information when encountered, and yield the // Item XElement objects as they're created. - // loop through Customer elements + // Loop through Customer elements do { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Customer") { - // move to Name element + // Move to Name element XElement? name = null; do { @@ -357,12 +357,12 @@ Module Module1 ' Parse the file, save header information when encountered, And yield the ' Item XElement objects as they're created. - ' loop through Customer elements + ' Loop through Customer elements Do If reader.NodeType = XmlNodeType.Element And reader.Name = "Customer" Then - ' move to Name element + ' Move to Name element Dim name As XElement = Nothing Do If reader.NodeType = XmlNodeType.Element And reader.Name = "Name" Then 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 6fdc245425376..259e977e7a1d3 100644 --- a/docs/standard/linq/stream-xml-fragments-access-header-information.md +++ b/docs/standard/linq/stream-xml-fragments-access-header-information.md @@ -83,12 +83,12 @@ static IEnumerable StreamCustomerItem(string uri) // Parse the file, save header information when encountered, and yield the // Item XElement objects as they're created. - // loop through Customer elements + // Loop through Customer elements do { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Customer") { - // move to Name element + // Move to Name element XElement? name = null; do { @@ -148,12 +148,12 @@ Module Module1 ' Parse the file, save header information when encountered, And yield the ' Item XElement objects as they're created. - ' loop through Customer elements + ' Loop through Customer elements Do If reader.NodeType = XmlNodeType.Element And reader.Name = "Customer" Then - ' move to Name element + ' Move to Name element Dim name As XElement = Nothing Do If reader.NodeType = XmlNodeType.Element And reader.Name = "Name" Then