This is really a 2 part question...
I have a XmlReader object I have created from a memory stream. I have used the .Read() method a few times and now I want to go back to the beginning and start over at the declaration node. How can I do that?
When creating the XmlReader object I create a XmlDocument object and a MemoryStream object. Do these objects need to be destroyed somehow after creating the XmlReader with the memory stream? Or would destroying them also effect the XmlReader object?
This is how I create the XmlReader object
XmlReader xmlReader = null;
XmlDocument doc = new XmlDocument();
doc.Load(m_sXMLPath);
if (doc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
{
XmlDeclaration dec = null;
byte[] bytes = null;
MemoryStream ms = null;
dec = (XmlDeclaration)doc.FirstChild;
switch (dec.Encoding.ToLower())
{
case "utf-8":
bytes = Encoding.UTF8.GetBytes(File.ReadAllText(m_sXMLPath));
break;
case "utf-16":
bytes = Encoding.Unicode.GetBytes(File.ReadAllText(m_sXMLPath));
break;
default:
throw new XmlException("");
}
if (bytes != null)
{
ms = new MemoryStream(bytes);
xmlReader = XmlReader.Create(ms);
}
}
You cannot restart your XmlReader
object to the beginning. As per Microsoft's documentation:
XmlReader provides forward-only, read-only access to a stream of XML data. The XmlReader class conforms to the W3C Extensible Markup Language (XML) 1.0 and the Namespaces in XML recommendations. http://msdn.microsoft.com/en-us/library/System.Xml.XmlReader.aspx
If for some reason you really do need to go back to the beginning, instead you should use your XmlReader
to load a XDocument
object. You can then use the XDocument
object to query any part of your XML. In addition, you should wrap your Stream based objects in a using
block so you don't need to worry about destruction. Example below:
XDocument myXmlDoc;
using(MemoryStream ms = new MemoryStream(bytes))
{
using(XmlReader xmlReader = XmlReader.Create(ms))
{
myXmlDoc = XDocument.Load(xmlReader);
//query your XDocument here to your heart's desire here in any order you want
}
}
In case you aren't familar with LINQ to XML take a look at the documentation here
If you don't want to use XDocument
and stick to XmlDocument
you can also use that (without queries) to re-traverse your XML document. Either way though you do not need to dispose of a XmlDocument
(or XDocument
) when you are done with it since it's not a disposable object.
The way you're using XmlReader makes no sense. Once you have the data loaded into the XmlDocument
(XDocument
would be better), there's no sense in using an XmlReader
.
In .NET, it is not generally necessary to destroy objects after use - that's what the garbage collector is for.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With