SenseNet.ContentRepository.Schema.FieldDescriptor.Parse C# (CSharp) Méthode

Parse() static private méthode

static private Parse ( XPathNavigator fieldElement, IXmlNamespaceResolver nsres, ContentType contentType ) : FieldDescriptor
fieldElement System.Xml.XPath.XPathNavigator
nsres IXmlNamespaceResolver
contentType ContentType
Résultat FieldDescriptor
		internal static FieldDescriptor Parse(XPathNavigator fieldElement, IXmlNamespaceResolver nsres, ContentType contentType)
		{
			FieldDescriptor fdesc = new FieldDescriptor();
			fdesc.Owner = contentType;
            var fieldName = fieldElement.GetAttribute("name", String.Empty);
            fdesc.FieldName = fieldName;
			fdesc.FieldTypeShortName = fieldElement.GetAttribute("type", String.Empty);
			fdesc.FieldTypeName = fieldElement.GetAttribute("handler", String.Empty);
            fdesc.IsContentListField = fdesc.FieldName[0] == '#';
            if (String.IsNullOrEmpty(fdesc.FieldTypeShortName))
                fdesc.FieldTypeShortName = FieldManager.GetShortName(fdesc.FieldTypeName);

			if (fdesc.FieldTypeName.Length == 0)
			{
				if (fdesc.FieldTypeShortName.Length == 0)
					throw new ContentRegistrationException("Field element's 'handler' attribute is required if 'type' attribute is not given.", contentType.Name, fdesc.FieldName);
				fdesc.FieldTypeName = FieldManager.GetFieldHandlerName(fdesc.FieldTypeShortName);
			}

			fdesc.Bindings = new List<string>();

			foreach (XPathNavigator subElement in fieldElement.SelectChildren(XPathNodeType.Element))
			{
				switch (subElement.LocalName)
				{
                    case "DisplayName":
                        fdesc.DisplayName = subElement.Value;
						break;
					case "Description":
						fdesc.Description = subElement.Value;
						break;
					case "Icon":
						fdesc.Icon = subElement.Value;
						break;
					case "Bind":
						fdesc.Bindings.Add(subElement.GetAttribute("property", String.Empty));
						break;
                    case "Indexing":
                        foreach (XPathNavigator indexingSubElement in subElement.SelectChildren(XPathNodeType.Element))
                        {
                            switch (indexingSubElement.LocalName)
                            {
                                case "Mode": fdesc.IndexingMode = indexingSubElement.Value; break;
                                case "Store": fdesc.IndexStoringMode = indexingSubElement.Value; break;
                                case "TermVector": fdesc.IndexingTermVector = indexingSubElement.Value; break;
                                case "Analyzer": fdesc.Analyzer = indexingSubElement.Value; break;
                                case "IndexHandler": fdesc.IndexHandlerTypeName = indexingSubElement.Value; break;
                            }
                        }
                        break;
					case "Configuration":
						fdesc.ConfigurationElement = subElement;
						fdesc.FieldSettingTypeName = subElement.GetAttribute("handler", String.Empty);
						break;
					case "AppInfo":
                        fdesc.AppInfo = subElement;
						break;
					default:
						throw new NotSupportedException(String.Concat("Unknown element in Field: ", subElement.LocalName));
				}
			}

			//-- Default binding;
			RepositoryDataType[] dataTypes = FieldManager.GetDataTypes(fdesc.FieldTypeShortName);
			fdesc.DataTypes = dataTypes;
            if (fdesc.IsContentListField)
            {
                foreach(var d in dataTypes)
                    fdesc.Bindings.Add(null);
            }
            else
            {
                if (dataTypes.Length > 1 && fdesc.Bindings.Count != dataTypes.Length)
                    throw new ContentRegistrationException("Missing excplicit 'Binding' elements", contentType.Name, fdesc.FieldName);
                if (dataTypes.Length == 1 && fdesc.Bindings.Count == 0)
                    fdesc.Bindings.Add(fdesc.FieldName);
            }

			fdesc.XmlNamespaceResolver = nsres;

			return fdesc;
		}
	}

Usage Example

Exemple #1
0
        //======================================================================================================= Runtime ContentType

        internal static ContentType Create(Type type, string ctd)
        {
            var contentType = new ContentType(ContentType.GetByName("GenericContent"));//HACK: come from ctd

            var reader    = new StringReader(ctd);
            var xml       = new XPathDocument(reader);
            var nametable = new NameTable();
            var nav       = xml.CreateNavigator();
            var nsres     = new XmlNamespaceManager(nav.NameTable);

            nsres.AddNamespace("x", ContentDefinitionXmlNamespace);
            var contentTypeElement = nav.Select("/x:ContentType", nsres);

            contentTypeElement.MoveNext();
            var contentTypeName = contentTypeElement.Current.GetAttribute("name", "");

            contentType.Name = contentTypeName;
            var fieldElements = nav.Select("/x:ContentType/x:Fields/x:Field", nsres);

            foreach (XPathNavigator fieldElement in fieldElements)
            {
                var fieldDescriptor = FieldDescriptor.Parse(fieldElement, nsres, contentType);
                var fieldSetting    = FieldSetting.Create(fieldDescriptor);
                contentType.FieldSettings.Add(fieldSetting);
            }
            contentType.SetFieldSlots(type);
            return(contentType);
        }
All Usage Examples Of SenseNet.ContentRepository.Schema.FieldDescriptor::Parse