Skipping over Nodes


Many times when reading an XML stream, you find that you are searching for one particular node or parent node in the document that meets a certain criterion. The XmlTextReader does not provide any methods that will allow you to find one particular node quickly. Therefore, searching an XML stream with the XmlTextReader can be both complicated and processor intensive . These issues can be alleviated if you design your XML data carefully . Listing 10.19 illustrates how to build a method that will search for a given error message in an XML document with the Skip method.

Listing 10.19
 C# public string FindErrorMessage(string filename, int catNumber, int errorNumber) {     XmlTextReader reader = new XmlTextReader(filename);     reader.WhitespaceHandling = WhitespaceHandling.None;     reader.Read();     reader.ReadStartElement("Errors");     int depth;     while(!reader.EOF && reader.Name != "Errors")     {       if(reader["Number"] != catNumber.ToString())       {         reader.Skip();         continue;       }       depth = reader.Depth;       reader.Read();       if(reader.Depth <= depth)          return string.Empty;       depth = reader.Depth;       while(reader.Depth == depth)       {         if(reader["Number"] == errorNumber.ToString())           return reader.ReadElementString();         reader.Skip();       }       return string.Empty;    }    return string.Empty; } VB Function _ FindErrorMessage (ByVal filename As String, _                   ByVal catNumber As Integer, _                   ByVal errorNumber As Integer) As String   Dim reader = New XmlTextReader(filename)   reader.WhitespaceHandling = WhitespaceHandling.None   reader.Read()   reader.ReadStartElement("Errors")   Dim depth As Integer   While (Not reader.EOF And Not reader.Name = "Errors")     If (Not reader("Number") = catNumber.ToString()) Then       reader.Skip()     Else       depth = reader.Depth       reader.Read()       If (reader.Depth <= depth) Then         Return String.Empty       End If       depth = reader.Depth       While (reader.Depth = depth)         If (reader("Number") = errorNumber.ToString()) Then           Return reader.ReadElementString()         End If         reader.Skip()       End While     End If     Return String.Empty   End While   Return String.Empty End Function Input Data <Errors>       <Category Number="1">             <Error Number="1">Stick A Fork In Me!</Error>             <Error Number="2">...I'm Done!</Error>             ...       </Category>       <Category Number="2">             <Error Number="1">Hmmm...Bad Mojo!</Error>             <Error Number="2">This cannot be good!</Error>             ...       </Category>       <Category Number="3">             <Error Number="1">File Not Found!</Error>             <Error Number="2">What did you do!</Error>             ...       </Category> </Errors> 


Microsoft.NET Compact Framework Kick Start
Microsoft .NET Compact Framework Kick Start
ISBN: 0672325705
EAN: 2147483647
Year: 2003
Pages: 206

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net