У меня есть схема xsd, которая описывает несколько root элементов. На основе этой схемы построен класс, используя xsd.exe
Есть ли какой либо простой способ определять элемент какого типа в файле является root'ом (без повторных прогонок десериализатором)?
Т.е.
есть, например такой xml
<systemError>
<code></code>
<message></message>
</systemError>
и такой
<result>
<property name=""></property>
</result>
Соответственно, есть классы systemErrorType и resultType
Можно ли это как-нибудь просто и красиво обработать?
Если я правильно понял вашу задачу, то:
-На входе имеем некий XML-контент и набор типов, сгенерированных xsd
-Требуется понять, какой из типов использовать для десериализации данного XML
Можно сделать, например, так:
public object Deserialize( Stream stream, out Type type )
{
var type = DetectType( stream );
var ser = new XmlSerializer( type );
return ser.Deserialize( stream );
}
static Type DetectType( Stream stream )
{
var settings = new XmlReaderSettings
{
CloseInput = false,
IgnoreComments = true,
IgnoreProcessingInstructions = true,
};
long pos = stream.Position;
try
{
using ( var reader = XmlReader.Create( stream, settings ) )
{
reader.MoveToContent();
switch ( reader.LocalName )
{
case "systemError": return typeof( systemErrorType );
case "result": return typeof( resultType );
default:
throw new InvalidOperationException( "Unknown xml format" );
}
}
}
finally { stream.Position = pos; }
}
Здравствуйте, RushDevion, Вы писали:
Спасибо за идею...
Буду пробовать...