コード例 #1
0
 public IValue Get(XdtoProperty property)
 {
     if (property != null && _data.ContainsKey(property))
     {
         return(_data [property]);
     }
     return(ValueFactory.Create());
 }
コード例 #2
0
 internal XdtoDataObject(XdtoObjectType type, XdtoDataObject owner, XdtoProperty property)
 {
     _type           = type;
     _owner          = owner;
     _owningProperty = property;
     _sequence       = new XdtoSequence(this, true);
     FillPropertiesFromType();
 }
コード例 #3
0
        public void Add(XmlFormEnum form, string namespaceUri, string localName, IXdtoValue dataElement)
        {
            if (_type?.Open ?? true)
            {
                var customProperty = new XdtoProperty(null, this, form, namespaceUri, localName);
                Add(customProperty, dataElement);
            }

            throw new RuntimeException("Добавлять можно только в объекты открытого типа!");
        }
コード例 #4
0
        public IValue GetList(XdtoProperty property)
        {
            var v = Get(property) as XdtoList;

            if (v == null)
            {
                v = new XdtoList(this, property);
                _data[property] = v;
            }
            return(v);
        }
コード例 #5
0
        public IXdtoValue GetXdto(XdtoProperty property)
        {
            var value = Get(property);

            if (value is IXdtoValue)
            {
                return(value as IXdtoValue);
            }

            if (property.Type is XdtoValueType)
            {
                return(new XdtoDataValue(property.Type as XdtoValueType, value?.AsString() ?? "", value));
            }

            return(_pv.SerializeXdto(value, null));
        }
コード例 #6
0
        public void Add(XdtoProperty property, IXdtoValue dataElement)
        {
            XdtoList list;

            if (_data.ContainsKey(property))
            {
                list = _data [property] as XdtoList;
                if (list == null)
                {
                    list             = new XdtoList(this, property);
                    _data [property] = list;
                }
            }
            else
            {
                list             = new XdtoList(this, property);
                _data [property] = list;
            }

            list.Add(ValueFactory.Create(dataElement));
        }
コード例 #7
0
 internal XdtoList(XdtoDataObject owner, XdtoProperty owningProperty)
 {
     Owner          = owner;
     OwningProperty = owningProperty;
 }
コード例 #8
0
 public void Insert(int index, XdtoProperty property, IValue dataElement)
 {
     elements.Insert(index, new XdtoSequenceValueElement(property, dataElement as IXdtoValue));
 }
コード例 #9
0
 public void Add(XdtoProperty property, IValue dataElement)
 {
     elements.Add(new XdtoSequenceValueElement(property, dataElement as IXdtoValue));
 }
コード例 #10
0
 public XdtoSequenceValueElement(XdtoProperty property, IXdtoValue value)
 {
     Value = value;
 }
コード例 #11
0
 public bool IsSet(XdtoProperty property)
 {
     return(_data.ContainsKey(property));
 }
コード例 #12
0
 public void Set(XdtoProperty property, IValue value)
 {
     RegisterProperty(property.LocalName);
     _data [property] = value;
 }
コード例 #13
0
 public void Unset(XdtoProperty property)
 {
     _data.Remove(property);
     RemoveProperty(property.LocalName);
 }
コード例 #14
0
        internal void BuildPackage()
        {
            if (_built)
            {
                return;
            }
            _built = true;

            foreach (var include in _schema.Includes)
            {
                if (include is XmlSchemaImport)
                {
                    var import          = include as XmlSchemaImport;
                    var packagetoImport = _factory.Packages.Get(import.Namespace);
                    // TODO: what if null ?
                    packagetoImport?.BuildPackage();
                }
            }

            foreach (var oType in _schema.SchemaTypes)
            {
                var dElement = (DictionaryEntry)oType;
                var type     = dElement.Value;
                if (type is XmlSchemaSimpleType)
                {
                    _types.Add(new XdtoValueType(type as XmlSchemaSimpleType, _factory));
                }
                else
                if (type is XmlSchemaComplexType)
                {
                    _types.Add(new XdtoObjectType(type as XmlSchemaComplexType, _factory));
                }
            }

            var rootProperties = new List <XdtoProperty> ();

            foreach (var oElement in _schema.Elements)
            {
                var elPair  = (DictionaryEntry)oElement;
                var element = elPair.Value as XmlSchemaElement;

                // в XDTO под элемент создаётся свой тип с таким же именем
                IXdtoType elementType;
                if (element.SchemaType is XmlSchemaSimpleType)
                {
                    elementType = new XdtoValueType(element.SchemaType as XmlSchemaSimpleType, _factory);
                }
                else if (element.SchemaType is XmlSchemaComplexType)
                {
                    elementType = new XdtoObjectType(element, _factory);
                }
                else
                {
                    // TODO: Присвоить anyType
                    throw new NotImplementedException();
                }

                _types.Add(elementType);

                var property = new XdtoProperty(XmlFormEnum.Element,
                                                element.QualifiedName.Namespace,
                                                element.QualifiedName.Name,
                                                elementType);
                rootProperties.Add(property);
            }

            RootProperties = new XdtoPropertyCollection(rootProperties);
        }
コード例 #15
0
        public IXdtoValue ReadXml(XmlReaderImpl reader, IXdtoType expectedType, XdtoFactory factory)
        {
            // TODO: дублирование кода в трёх ветках

            var result = new XdtoDataObject(this, null, null);

            // TODO: Перевести XML на простые перечисления
            var xmlNodeTypeEnum = XmlNodeTypeEnum.CreateInstance();
            var xmlElementStart = xmlNodeTypeEnum.FromNativeValue(System.Xml.XmlNodeType.Element);
            var xmlText         = xmlNodeTypeEnum.FromNativeValue(System.Xml.XmlNodeType.Text);
            var xmlElementEnd   = xmlNodeTypeEnum.FromNativeValue(System.Xml.XmlNodeType.EndElement);

            while (reader.ReadAttribute())
            {
                if (reader.NamespaceURI.Equals("http://www.w3.org/2000/xmlns/") ||
                    reader.NamespaceURI.Equals(XmlNs.xsi) && reader.LocalName.Equals("type"))
                {
                    continue;
                }
                var propertyName       = reader.LocalName;
                var attributeNamespace = reader.NamespaceURI;
                var attributeProperty  =
                    AllProperties().FirstOrDefault(p => p.Form == XmlFormEnum.Attribute &&
                                                   p.LocalName.Equals(propertyName) &&
                                                   p.NamespaceURI.Equals(attributeNamespace));

                if (attributeProperty == null)
                {
                    if (!Open)
                    {
                        throw new XdtoException($"Ошиба разбора XDTO: Получили неизвестный атрибут {propertyName}");
                    }
                    var type = factory.Type(new XmlDataType("string"));
                    attributeProperty = new XdtoProperty(null, result, XmlFormEnum.Attribute,
                                                         NamespaceUri, propertyName,
                                                         1, -1, type); // TODO: lower / upper для открытого типа
                }

                var attributeValue = attributeProperty.Type.Reader.ReadXml(reader, attributeProperty.Type, factory);
                result.Set(attributeProperty, ValueFactory.Create(attributeValue));
            }

            while (reader.Read())
            {
                if (reader.NodeType.Equals(xmlElementEnd))
                {
                    // TODO: result.Validate()
                    return(result);
                }

                if (reader.NodeType.Equals(xmlText))
                {
                    // надо найти свойство с Form=Text
                    // оно должно быть одно

                    var       textProperty = AllProperties().FirstOrDefault((p) => p.Form == XmlFormEnum.Text);
                    IXdtoType type;
                    IValue    textValue;
                    if (textProperty == null)
                    {
                        if (!Open)
                        {
                            throw new XdtoException($"Ошибка разбора XDTO: Текст {reader.Value} в неположенном месте при разборе типа {this}!");
                        }

                        textProperty = new XdtoProperty(null, result, XmlFormEnum.Text, NamespaceUri, "#text");
                        type         = factory.Type(new XmlDataType("string"));
                        textValue    = ValueFactory.Create(reader.Value);
                    }
                    else
                    {
                        type      = textProperty.Type;
                        textValue = ValueFactory.Create(type.Reader.ReadXml(reader, type, factory));
                    }

                    if (Sequenced)
                    {
                        result.Sequence().Add(textValue.AsString());
                    }
                    else
                    {
                        result.Set(textProperty, textValue);
                    }
                }
                else if (reader.NodeType.Equals(xmlElementStart))
                {
                    var localName = reader.LocalName;
                    var ns        = reader.NamespaceURI;

                    var property = AllProperties().FirstOrDefault((p) => p.LocalName.Equals(localName) &&
                                                                  p.NamespaceURI.Equals(ns) &&
                                                                  p.Form == XmlFormEnum.Element);
                    if (property == null)
                    {
                        if (!Open)
                        {
                            throw new XdtoException($"Ошибка разбора XDTO: Получили неизвестный элемент {localName}");
                        }

                        // TODO: lower / upper для открытого типа
                        property = new XdtoProperty(null, result, XmlFormEnum.Element, ns, localName, 1, 1);
                    }

                    var elementValue = factory.ReadXml(reader, property.Type);

                    // TODO: Разбор anyType
                    if (property.UpperBound != 1)
                    {
                        // TODO: проверка на null - на отсутствие/наличие списка
                        (result.GetList(property) as XdtoList).Add(elementValue);
                    }
                    else
                    {
                        result.Set(property, elementValue);
                    }
                }
            }

            throw new XdtoException("Ошибка разбора XDTO!");
        }