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>

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.144.15.43