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
			}
		}