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)); }