protected virtual NameClass ChoiceName()
        {
            NameClass nc = null;

            if (ReadStartElement())
            {
                while (SkipForeignElements())
                {
                    NameClass child = ReadNameClass();
                    if (nc == null)
                    {
                        nc = child;
                    }
                    else
                    {
                        nc = new ChoiceNameClass(nc, child);
                    }
                }
                ReadEndElement();
            }
            if (nc == null)
            {
                // error: no children
                ReportError(ERR_NO_CHILD_NAMECLASS);
                nc = new SimpleNameClass("foo", "bar");         // recover
            }
            return(nc);
        }
        protected virtual NameClass ReadNameClassOrNameAttr(bool isAttribute, out bool isEmpty)
        {
            string name = GetAttribute("name");

            if (name != null)
            {
                NameClass nc;

                // there is @name
                if (isAttribute &&
                    reader.GetAttribute("ns") == null && // there is no @ns
                    name.IndexOf(':') == -1)             // name is NCName
                {
                    nc = new SimpleNameClass(new XmlName("", name));
                }
                else
                {
                    nc = new SimpleNameClass(ProcessQName(name));
                }

                isEmpty = !ReadStartElement();
                return(nc);
            }
            isEmpty = !ReadStartElement();
            return(ReadNameClass());
        }
 protected virtual NameClass SimpleName()
 {
     if (reader.IsEmptyElement)
     {
         ReadStartElement();
         // TODO: error message
         return(new SimpleNameClass("undefined", "undefined"));
     }
     else
     {
         ReadStartElement();
         string name = ReadPCDATA();
         if (name == null)
         {
             name = "undefined";
         }
         NameClass nc = new SimpleNameClass(ProcessQName(name.Trim()));
         ReadEndElement();
         return(nc);
     }
 }