[RESOLVED] XElement remove ProcessingInstruction problem / solution
We have a requirement to convert some large XML files from one messy format to a cleaner version. In the process of doing that I discovered an issue with XElement.
This sequence doesn't work all the time. Trust me. If one of the files was small I'd attach it, but they aren't.
Code:
Dim MyXElement As XElement
MyXElement = XElement.Load("Messy file.xml")
Dim ndList As List(Of XNode) = MyXElement.DescendantNodesAndSelf.ToList
For x As Integer = ndList.Count - 1 To 0 Step -1
If ndList(x).NodeType = Xml.XmlNodeType.ProcessingInstruction Then
ndList.RemoveAt(x)
End If
Next
After extensive searching I received an 'AI Overview' that provided a solution that has worked with 2,000 files.
The answer is to use XDocument.
Code:
Dim s As String = someXE.ToString 'convert XElement to string
' Create XDocument from string
Dim xdoc As XDocument = XDocument.Parse(s)
' Find the processing instructions
Dim piL As List(Of XProcessingInstruction)
piL = xdoc.DescendantNodes().OfType(Of XProcessingInstruction)().ToList
' Remove the processing instructions
For Each pi As XProcessingInstruction In piL
pi.Remove()
Next
'the Root of xdoc is a XElement without XProcessingInstruction
Hopefully the search bots will find this post, no one should have to go through what I did to find this answer.
When I phrased the question correctly the AI provided this along with the answer,
Quote:
When working with XElement in VB.NET, removing a processing instruction can be tricky because processing instructions (<?xml ... ?>) are not part of the content of an XElement — they are part of the XML document (i.e., XDocument) or sometimes part of an XContainer like the parent of an element.
I'll mark this resolved.