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.
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> |
3.144.15.43