Exemplo n.º 1
0
        private void ProcessSequence(CompoundField compilerInfo, String ancestor, XmlSchemaSequence sequence, uint index, uint cardinality)
        {
            //output.WriteLine(feed() + "Processing sequence [{0}..{1}]", sequence.MinOccurs, sequence.MaxOccurs);

            if (sequence.MaxOccurs == 1)
            {
                ProcessItemCollection(compilerInfo, ancestor, sequence.Items, 1);
                return;
            }

            CompoundField arg = new CompoundField(ancestor, (uint)sequence.MaxOccurs);

            ProcessItemCollection(arg, null, sequence.Items, 1);
            compilerInfo.AddField(arg);

            /*CompoundField arg = new CompoundField(ancestor, (uint)sequence.MaxOccurs);
             * ProcessItemCollection(arg, null, sequence.Items, 1);
             * compilerInfo.AddField(arg);*/
        }
Exemplo n.º 2
0
        private static void Binarize(CompoundField compilerInfo, string prefix, XmlSchemaElement elem, uint index, uint cardinality)
        {
            XmlSchemaDatatypeVariety dataType = elem.ElementSchemaType.Datatype.Variety;
            string name = prefix + elem.Name;

            if (cardinality > 1)
            {
                throw new XmlBinaryConverterException("cardinality greater than 1 is not supported");
                //name += "[" + index + "]";
            }

            ACompilerInfoField cif = null;
            IEnumerable <XmlSchemaLengthFacet>      lengthFacets;
            IEnumerable <XmlSchemaMaxLengthFacet>   maxLengthFacet;
            IEnumerable <XmlSchemaEnumerationFacet> enumerationFacets;

            switch (elem.ElementSchemaType.TypeCode)
            {
            case XmlTypeCode.String:
                try
                {
                    var simpleType  = elem.ElementSchemaType as XmlSchemaSimpleType;
                    var restriction = simpleType.Content as XmlSchemaSimpleTypeRestriction;
                    maxLengthFacet    = restriction.Facets.OfType <XmlSchemaMaxLengthFacet>();
                    enumerationFacets = restriction.Facets.OfType <XmlSchemaEnumerationFacet>();
                }
                catch (Exception e)
                {
                    throw new XmlBinaryConverterException($"Unexpected exception while processing element {name}");
                }

                if (maxLengthFacet.Count() != 0)
                {
                    cif = new StringField(name, uint.Parse(maxLengthFacet.ElementAt(0).Value));
                }
                else if (enumerationFacets.Count() != 0)
                {
                    List <string> values = enumerationFacets.Select(e => e.Value).ToList();
                    cif = new StringEnumField(name, values);
                }
                else
                {
                    throw new XmlBinaryConverterException(
                              $"String {name} have unrestricted length and thus is not supported for schema generation");
                }
                break;

            case XmlTypeCode.Int:
                cif = new Int32Field(name);
                break;

            case XmlTypeCode.UnsignedInt:
                cif = new UInt32Field(name);
                break;

            case XmlTypeCode.Short:
                cif = new Int16Field(name);
                break;

            case XmlTypeCode.UnsignedShort:
                cif = new UInt16Field(name);
                break;

            case XmlTypeCode.Byte:
                cif = new SByteField(name);
                break;

            case XmlTypeCode.UnsignedByte:
                cif = new ByteField(name);
                break;

            case XmlTypeCode.UnsignedLong:
                cif = new UInt64Field(name);
                break;

            case XmlTypeCode.Boolean:
                cif = new BooleanField(name);
                break;

            case XmlTypeCode.HexBinary:
                try
                {
                    var simpleType  = elem.ElementSchemaType as XmlSchemaSimpleType;
                    var restriction = simpleType.Content as XmlSchemaSimpleTypeRestriction;
                    lengthFacets = restriction.Facets.OfType <XmlSchemaLengthFacet>();
                }
                catch (Exception e)
                {
                    throw new XmlBinaryConverterException($"Unexpected exception while processing element {name}");
                }

                if (lengthFacets.Count() != 0)
                {
                    uint size = uint.Parse(lengthFacets.ElementAt(0).Value);
                    cif = new HexBinaryField(name, size);
                }
                else
                {
                    throw new XmlBinaryConverterException(
                              $"HexBinary {name} have unrestricted length and thus is not supported for schema generation");
                }
                break;

            case XmlTypeCode.DateTime:
                cif = new DateTimeField(name, "yyyyMMddHHmmss");
                break;

            default:
            {
                throw new XmlBinaryConverterException($"{name} have unsupported type {elem.ElementSchemaType.TypeCode}");
            }
            }

            if (cif == null)
            {
                throw new XmlBinaryConverterException($"Internal error: unable to create a conversion structure for {name}");
            }

            compilerInfo.AddField(cif);
        }