/// <summary>
        /// Returns an INodeIterator instance that iterates the children
        /// of the current node; otherwise, <c>Null</c>.
        /// </summary>
        /// <returns></returns>
        public override INodeIterator GetChildren()
        {
            SifVersion version = Version;


            // Get all of the Element fields and children that match the
            // NodeTest into a list
            SifFormatter    formatter = Adk.Dtd.GetFormatter(version);
            IList <Element> elements  = formatter.GetContent(fSifElement, version);

            if (elements.Count == 0)
            {
                return(null);
            }
            else if (elements.Count == 1)
            {
                Element singleChild = elements[0];
                if (singleChild is SimpleField)
                {
                    return(new SingleNodeIterator(SimpleFieldPointer.Create(this, (SimpleField)singleChild)));
                }
                else
                {
                    return(new SingleNodeIterator(Create(this, (SifElement)singleChild, version)));
                }
            }


            return(new AdkElementIterator(this, elements));
        }
        public override INodePointer CreateChild(SifXPathContext context, string name, int i)
        {
            SifVersion   version    = Version;
            IElementDef  subEleDef  = GetChildDef(name);
            SifFormatter formatter  = Adk.Dtd.GetFormatter(version);
            SifElement   sifElement = (SifElement)fElement;

            // Check to see if this child has a render surrogate defined
            IRenderSurrogate rs = subEleDef.GetVersionInfo(version).GetSurrogate();

            if (rs != null)
            {
                return(rs.CreateChild(this, formatter, version, context));
            }

            if (subEleDef.Field)
            {
                SifSimpleType ssf = subEleDef.TypeConverter.GetSifSimpleType(null);
                SimpleField   sf  = formatter.SetField(sifElement, subEleDef, ssf, version);
                return(SimpleFieldPointer.Create(this, sf));
            }
            else
            {
                SifElement newEle = SifElement.Create(sifElement, subEleDef);
                formatter.AddChild(sifElement, newEle, version);
                return(new SifElementPointer(this, newEle, version));
            }
        }
 /// <summary>
 /// Called on the subclass when a specific NodePointer is requested by SIFXPath
 /// </summary>
 /// <param name="parent"></param>
 /// <param name="element"></param>
 /// <returns></returns>
 protected override INodePointer GetNodePointer(SifElementPointer parent, Element element)
 {
     if (element is SimpleField)
     {
         return(SimpleFieldPointer.Create(parent, (SimpleField)element));
     }
     else
     {
         return(SifElementPointer.Create(parent, (SifElement)element, parent.Version));
     }
 }
        public override INodePointer CreateAttribute(SifXPathContext context, String name)
        {
            IElementDef subEleDef  = GetChildDef(name);
            SifElement  sifElement = (SifElement)fElement;

            if (subEleDef.Field)
            {
                SifSimpleType ssf = subEleDef.TypeConverter.GetSifSimpleType(null);
                SimpleField   sf  = ssf.CreateField(sifElement, subEleDef);
                sifElement.SetField(sf);
                return(SimpleFieldPointer.Create(this, sf));
            }

            throw new ArgumentException(
                      "Factory could not create a child node for path: " + Name
                      + "/" + name);
        }
 /// <summary>
 /// Called on the subclass when a specific NodePointer is requested by SIFXPath
 /// </summary>
 /// <param name="parent"></param>
 /// <param name="element"></param>
 /// <returns></returns>
 protected override INodePointer GetNodePointer(SifElementPointer parent, Element element)
 {
     return(SimpleFieldPointer.Create(parent, (SimpleField)element));
 }