How to read from an XmlReader without moving it forwards? How to read from an XmlReader without moving it forwards? xml xml

How to read from an XmlReader without moving it forwards?


Actually ReadSubtree will return a reader which "wraps" the original reader. So reading through the new one will end up advancing the original one as well.You must consider XmlReader as a forward only reader, it simply can't go back.As for your scenario, instead of trying to remember part of the XML you can ask the reader for the position in the input file. Just cast it to IXmlLineInfo interface, it has methods to return line and position. Using this you could remember some starting position (before the element in question) and then the end position of the error. And then read that part from the intput file as a plain text.


Another idea: read the outer XML (which advances the reader), then create a new reader from this XML which allows you to "go back" and process the elements of the current node.

while (r.ReadToFollowing("ParentNode")){    parentXml = r.ReadOuterXml();    //since ReadOuterXml() advances the reader to the next parent node, create a new reader to read the remaining elements of the current parent    XmlReader r2 = XmlReader.Create(new StringReader(parentXml));    r2.ReadToFollowing("ChildNode");    childValue = r2.ReadElementContentAsString();    r2.Close();}                  


Don't use any 'Read' operation on the reader- as you've discovered, this advances it. Use calls to properties such as reader.HasValue and reader.Value to inspect the contents. Look up 'XmlReader' in the object browser, there's quite a few properties you can read.

Edit: I don't think there's an easy way of simply getting the XML, possibly because the current node may not be valid XML on it's own, such as an XmlWhiteSpace, XmlText node or even an XmlAttribute.