static void ReadMembersSection(XmlTextReader reader, LinePositionMapper linePosMapper, List <IndexEntry> indexList) { while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.EndElement: if (reader.LocalName == "members") { return; } break; case XmlNodeType.Element: if (reader.LocalName == "member") { int pos = linePosMapper.GetPositionForLine(reader.LineNumber) + Math.Max(reader.LinePosition - 2, 0); string memberAttr = reader.GetAttribute("name"); if (memberAttr != null) { indexList.Add(new IndexEntry(GetHashCode(memberAttr), pos)); } reader.Skip(); } break; } } }
void ReadXmlDoc(XmlTextReader reader) { //lastWriteDate = File.GetLastWriteTimeUtc(fileName); // Open up a second file stream for the line<->position mapping using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete)) { LinePositionMapper linePosMapper = new LinePositionMapper(fs, encoding); List<IndexEntry> indexList = new List<IndexEntry>(); while (reader.Read()) { if (reader.IsStartElement()) { switch (reader.LocalName) { case "members": ReadMembersSection(reader, linePosMapper, indexList); break; } } } indexList.Sort(); this.index = indexList.ToArray(); // volatile write } }