在反序列化之前如何区分XML文件的类型?

Jan*_*ndt 7 c# xml xmlserializer deserialization musicxml

我正在将MusicXML文件加载到我的程序中.问题:有两种"方言",时间部分,它们有不同的根节点(和不同的结构):

<?xml version="1.0" encoding='UTF-8' standalone='no' ?>
<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 2.0 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd">
<score-partwise version="2.0">
    <work>...</work>
    ...
</score-partwise>
Run Code Online (Sandbox Code Playgroud)

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE score-timewise PUBLIC "-//Recordare//DTD MusicXML 2.0 Timewise//EN" "http://www.musicxml.org/dtds/timewise.dtd">
<score-timewise version="2.0">
   <work>...</work>
   ...
</score-timewise>
Run Code Online (Sandbox Code Playgroud)

我到目前为止反序列分数的代码是:

using (var fileStream = new FileStream(openFileDialog.FileName, FileMode.Open))
{
    var xmlSerializer = new XmlSerializer(typeof(ScorePartwise));
    var result = (ScorePartwise)xmlSerializer.Deserialize(fileStream);
}
Run Code Online (Sandbox Code Playgroud)

区分两种方言的最佳方法是什么?

Tim*_* S. 5

这是一种方法,通过使用XDocument解析文件,读取根元素来确定类型,并将其读入序列化程序.

var xdoc = XDocument.Load(filePath);
Type type;
if (xdoc.Root.Name.LocalName == "score-partwise")
    type = typeof(ScorePartwise);
else if (xdoc.Root.Name.LocalName == "score-timewise")
    type = typeof(ScoreTimewise);
else
    throw new Exception();
var xmlSerializer = new XmlSerializer(type);
var result = xmlSerializer.Deserialize(xdoc.CreateReader());
Run Code Online (Sandbox Code Playgroud)