예제 #1
0
        private void WriteTypeAttribute(XmlWriterImpl xmlWriter,
                                        IValue value)
        {
            string typeName;
            string typeUri;

            if (value is XdtoDataObject)
            {
                var obj = value as XdtoDataObject;
                typeUri  = obj.Type().NamespaceUri;
                typeName = obj.Type().Name;
            }
            else if (value is XdtoDataValue)
            {
                var obj = value as XdtoDataValue;
                typeUri  = obj.Type().NamespaceUri;
                typeName = obj.Type().Name;
            }
            else
            {
                typeName = "string";
                typeUri  = XmlNs.xs;
            }

            var ns = xmlWriter.LookupPrefix(typeUri)?.AsString();

            if (string.IsNullOrEmpty(ns))
            {
                // WriteAttribute(name, ns, value) при создании нового префикса
                //  не опознаёт префиксы, записанные через WriteNamespaceMapping
                var prefixIndex = xmlWriter.NamespaceContext.NamespaceMappings().Count() + 2;                   // TODO: Костыль с +2
                var prefixDepth = xmlWriter.NamespaceContext.Depth;
                ns = string.Format("d{0}p{1}", prefixDepth, prefixIndex);
                xmlWriter.WriteNamespaceMapping(ns, typeUri);
            }
            xmlWriter.WriteAttribute("type", XmlNs.xsi, string.Format("{0}:{1}", ns, typeName));
        }