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