private SemDomQuestion GetQuestion(XmlReader reader, out string ws)
        {
            ws = string.Empty;
            SemDomQuestion result = new SemDomQuestion();

            if (reader.LocalName != "CmDomainQ")
            {
                return(result);                 // If we weren't on the right kind of node, return empty SemDomQuestion
            }
            string name = reader.LocalName;

            while (reader.Read())
            {
                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {
                    case XmlNodeType.Element:
                    {
                        switch (reader.LocalName)
                        {
                        case "Question":
                            result.Question = GetStr(reader, out ws);
                            break;

                        case "ExampleWords":
                            result.ExampleWords = GetStr(reader, out ws);
                            break;

                        case "ExampleSentences":
                            result.ExampleSentences = GetStr(reader, out ws);
                            break;
                        }
                    }
                    break;

                    case XmlNodeType.EndElement:
                        if (reader.LocalName == "CmDomainQ")
                        {
                            // Advance past closing element before returning
                            reader.Read();
                            return(result);
                        }
                        break;
                    }
                }
            }
            return(result);
        }
        public override void PopulateFromXml(XmlReader reader)
        {
            if (reader.LocalName != "CmSemanticDomain")
            {
                return;                  // If we weren't on the right kind of node, do nothing
            }
            GuidStr = reader.GetAttribute("guid");
            string ws = string.Empty;             // Used as the out param in GetStr()

            // Note that if the writing systems in the SemDom.xml file are inconsistent, then
            // using a single out parameter everywhere may create inconsistent results. If we
            // ever need to parse a SemDom.xml with multiple writing systems in it, we might
            // have to change how we handle the "out ws" parameters in this function.
            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                case XmlNodeType.Element:
                {
                    switch (reader.LocalName)
                    {
                    case "CmSemanticDomain":
                        var child = new CanonicalSemanticDomainItem();
                        child.PopulateFromXml(reader);
                        AppendChild(child);
                        break;

                    case "Abbreviation":
                        string abbrev = GetStr(reader, out ws);
                        AddAbbrev(ws, abbrev);
                        break;

                    case "Name":
                        string name = GetStr(reader, out ws);
                        AddName(ws, name);
                        break;

                    case "Description":
                        string desc = GetStr(reader, out ws);
                        AddDescription(ws, desc);
                        break;

                    case "OcmCodes":
                        List <string> ocmCodes     = GetExtraDataList <string>("OcmCodes");
                        string        ocmCodesText = GetStr(reader, out ws);
                        ocmCodes.AddRange(ocmCodesText.Split(new string[] { ";  " }, StringSplitOptions.None));
                        break;

                    case "LouwNidaCodes":
                        List <string> louwNidaCodes     = GetExtraDataList <string>("OcmCodes");
                        string        louwNidaCodesText = GetStr(reader, out ws);
                        louwNidaCodes.AddRange(louwNidaCodesText.Split(new string[] { ";  " }, StringSplitOptions.None));
                        break;

                    case "CmDomainQ":
                        Dictionary <string, List <SemDomQuestion> > questionsDict = GetExtraDataWsDict <SemDomQuestion>("Questions");
                        SemDomQuestion        question  = GetQuestion(reader, out ws);
                        List <SemDomQuestion> questions = GetListFromDict <SemDomQuestion>(questionsDict, ws);
                        questions.Add(question);
                        break;
                    }
                    break;
                }

                case XmlNodeType.EndElement:
                {
                    if (reader.LocalName == "CmSemanticDomain")
                    {
                        Key = AbbrevByWs(KeyWs);
                        reader.Read();                                         // Skip past the closing element before returning
                        return;
                    }
                    break;
                }
                }
            }
        }