private void ResolveContainer(XmlReader reader, MetadataContainerBase container) { if (reader.ReadState == ReadState.Initial) { reader.Read(); } int depth = reader.Depth; while (reader.Read() && reader.Depth > depth) { if (reader.NodeType != XmlNodeType.Element) { continue; } switch (reader.Name) { case XML_ENTITY_ELEMENT: this.ResolveEntity(reader, container); break; case XML_ASSOCIATION_ELEMENT: if (container is MetadataConceptContainer conceptContainer) { this.ResolveAssociation(reader, conceptContainer); } else { this.ProcessUnrecognizedElement(reader, container.File, container); } break; case XML_COMMAND_ELEMENT: this.ResolveCommand(reader, container); break; default: this.ProcessUnrecognizedElement(reader, container.File, container); break; } } }
public MetadataCommandCollection(MetadataContainerBase container) : base(container) { }
private void ResolveCommand(XmlReader reader, MetadataContainerBase container) { //创建命令元素对象 var command = container.CreateCommand(reader.GetAttribute(XML_NAME_ATTRIBUTE)); //获取返回类型的名称 var resultType = this.GetAttributeValue <string>(reader, XML_RESULTTYPE_ATTRIBUTE); //如果指定的返回类型名不为空则解析它 if (!string.IsNullOrWhiteSpace(resultType)) { command.ResultType = Zongsoft.Common.TypeExtension.GetType(resultType); } //处理命令元素的所有其他未知属性 this.ProcessAttributes(reader, command, (element, prefix, localName, value, namespaceUri) => { return((localName == XML_NAME_ATTRIBUTE && string.IsNullOrEmpty(namespaceUri)) || (localName == XML_RESULTTYPE_ATTRIBUTE && string.IsNullOrEmpty(namespaceUri))); }); int depth = reader.Depth; while (reader.Read() && reader.Depth > depth) { if (reader.NodeType != XmlNodeType.Element) { continue; } switch (reader.Name) { case XML_PARAMETER_ELEMENT: var parameter = new MetadataCommandParameter(reader.GetAttribute(XML_NAME_ATTRIBUTE), reader.GetAttribute(XML_TYPE_ATTRIBUTE)) { Direction = this.GetAttributeValue <MetadataCommandParameterDirection>(reader, XML_DIRECTION_ATTRIBUTE, MetadataCommandParameterDirection.In), }; //将解析成功的命令参数元素加入到命令的参数集合 command.Parameters.Add(parameter); break; case XML_TEXT_ELEMENT: if (reader.NodeType == XmlNodeType.CDATA || reader.NodeType == XmlNodeType.Text) { command.Text = reader.Value; } break; default: this.ProcessUnrecognizedElement(reader, null, container); break; } } switch (container.Kind) { case MetadataElementKind.Concept: ((MetadataConceptContainer)container).Commands.Add(command); break; case MetadataElementKind.Storage: ((MetadataStorageContainer)container).Commands.Add(command); break; } }
private void ResolveEntity(XmlReader reader, MetadataContainerBase container) { //创建实体元素对象 var entity = container.CreateEntity(reader.GetAttribute(XML_NAME_ATTRIBUTE)); //设置实体元素的基类名 entity.BaseEntityName = reader.GetAttribute(XML_INHERITS_ATTRIBUTE); //处理实体元素的所有其他未知属性 this.ProcessAttributes(reader, entity, (element, prefix, localName, value, namespaceUri) => { return((localName == XML_NAME_ATTRIBUTE && string.IsNullOrEmpty(namespaceUri)) || (localName == XML_INHERITS_ATTRIBUTE && string.IsNullOrEmpty(namespaceUri))); }); int depth = reader.Depth; while (reader.Read() && reader.Depth > depth) { if (reader.NodeType != XmlNodeType.Element) { continue; } switch (reader.Name) { case XML_KEY_ELEMENT: while (reader.Read() && reader.Depth > depth + 1) { if (reader.NodeType != XmlNodeType.Element) { continue; } if (reader.Name == XML_PROPERTYREF_ELEMENT) { entity.SetKey(reader.GetAttribute(XML_NAME_ATTRIBUTE)); } else { this.ProcessUnrecognizedElement(reader, null, container); } } break; case XML_PROPERTY_ELEMENT: var property = new MetadataEntitySimplexProperty(reader.GetAttribute(XML_NAME_ATTRIBUTE), reader.GetAttribute(XML_TYPE_ATTRIBUTE)) { Length = this.GetAttributeValue <int>(reader, XML_LENGTH_ATTRIBUTE), Nullable = this.GetAttributeValue <bool>(reader, XML_NULLABLE_ATTRIBUTE), Precision = this.GetAttributeValue <byte>(reader, XML_PRECISION_ATTRIBUTE), Scale = this.GetAttributeValue <byte>(reader, XML_SCALE_ATTRIBUTE), }; //处理属性元素的所有其他未知属性 this.ProcessAttributes(reader, property, (element, prefix, localName, value, namespaceUri) => { return((localName == XML_LENGTH_ATTRIBUTE && string.IsNullOrEmpty(namespaceUri)) || (localName == XML_NULLABLE_ATTRIBUTE && string.IsNullOrEmpty(namespaceUri)) || (localName == XML_PRECISION_ATTRIBUTE && string.IsNullOrEmpty(namespaceUri)) || (localName == XML_SCALE_ATTRIBUTE && string.IsNullOrEmpty(namespaceUri))); }); //将解析成功的属性元素加入到实体的属性集合 entity.Properties.Add(property); break; case XML_COMPLEXPROPERTY_ELEMENT: var complexProperty = new MetadataEntityComplexProperty( reader.GetAttribute(XML_NAME_ATTRIBUTE), reader.GetAttribute(XML_RELATIONSHIP_ATTRIBUTE), reader.GetAttribute(XML_FROM_ATTRIBUTE), reader.GetAttribute(XML_TO_ATTRIBUTE)); //将解析成功的属性元素加入到实体的属性集合 entity.Properties.Add(complexProperty); break; default: this.ProcessUnrecognizedElement(reader, null, container); break; } } switch (container.Kind) { case MetadataElementKind.Concept: ((MetadataConceptContainer)container).Entities.Add((MetadataConceptEntity)entity); break; case MetadataElementKind.Storage: ((MetadataStorageContainer)container).Entities.Add((MetadataStorageEntity)entity); break; } }