/// <summary> /// read through XML tags until we reach either: /// 1 - Start of targetTag /// 2 - End of outerTag or empty outerTag was read /// 3 - End of XML file /// While 2 or 3 have not occured, it repeats to execute tagReader /// Returns false if 2 or 3 happens, true in case of 1 /// </summary> /// <param name="reader"></param> /// <param name="targetTag"></param> /// <param name="outerTag"></param> public static bool ProcessTag(XmlReader reader, string targetTag, string outerTag, TagReaderDelegate tagReader) { while (!((reader.EOF) || (reader.Name == targetTag && reader.NodeType == XmlNodeType.Element) || (outerTag != null && reader.Name == outerTag && reader.NodeType == XmlNodeType.EndElement))) { if ((outerTag != null && reader.Name == outerTag && reader.IsEmptyElement)) { return(false); } reader.Read(); } if (reader.Name == targetTag && reader.NodeType == XmlNodeType.Element) { //run tagReader and go for the next occurence of 'targetTag' within outerTag tagReader(); return(true); } return(false); }
/// <summary> /// read through XML tags until we reach either: /// 1 - Start of targetTag /// 2 - End of outerTag /// 3 - End of XML file /// While 2 or 3 have not occured, it repeats to execute tagReader /// Returns false if 2 or 3 happens, true in case of 1 /// </summary> /// <param name="reader"></param> /// <param name="targetTag"></param> /// <param name="outerTag"></param> public static void ProcessTagArray(XmlReader reader, string targetTag, string outerTag, TagReaderDelegate tagReader) { while (true) { bool processed = ProcessTag(reader, targetTag, outerTag, tagReader); //exit if outerTag is seen or document is finished if (!processed) { return; } else { reader.Read(); //move to the next item so ProcessTag will continue to next tag } } }