К сожалению, это допустимый XML и полностью соответствует стандарту XML.
Это подтверждает, это правильно, и это завершено.
Проблема, с которой вы столкнулись, заключается в десериализации, которая не является частью стандарта XML и связана с тем, как .NET отображает объявленные типы XML во внутренние типы CLR.
xsi: type является ссылкой на пространство имен и предназначен для того, чтобы документы XML могли заменить производный тип из другого пространства имен для объявленного типа в схеме.
Я знаю по собственному опыту, что кодеры, как правило, реагируют на шок, что такие вещи даже законны, а тем более не совсем корректны. Это в основном угоняет вашу схему.
Вам даже не нужно включать пространство иностранных имен, чтобы это считалось правильным.
(см. Эту статью для получения дополнительной информации по этому вопросу: http://norman.walsh.name/2004/01/29/trainwreck)
Теперь о том, как справиться с заявленной вами проблемой: десериализовать этот беспорядок
1) обработать текст xml и удалить объявление xsi-types и надеяться, что нет объявленных полей, расширяющих базовый тип.
2) объявите тип, производный от вашего базового типа в схеме.
Это выглядит следующим образом:
// note this "XmlIncludeAttribute" references the derived type.
// note that in .NET they are in the same namespace, but in XML they are in different namespaces.
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedType))]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://BaseNameSpace")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://BaseNameSpace", IsNullable=true)]
public partial class MyBaseType : object
{
...
}
/// <remarks/>
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://DerivedNameSpace")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://DerivedNameSpace", IsNullable=true)]
public partial class DerivedType: MyBaseType
{
...
}
Это только грубый набросок, надеюсь, достаточно, чтобы вы начали. Обратите внимание, что эту проблему решить непросто программно, потому что всегда кто-то может передать вам XML, и он будет проверять, но не десериализовать должным образом.