【发布时间】:2014-05-14 19:19:08
【问题描述】:
我正在将 MusicXML 文件加载到我的程序中。问题:有两种“方言”,timewise 和 partwise,它们有不同的根节点(和不同的结构):
<?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>
和
<?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>
到目前为止,我用于反序列化 partwise 分数的代码是:
using (var fileStream = new FileStream(openFileDialog.FileName, FileMode.Open))
{
var xmlSerializer = new XmlSerializer(typeof(ScorePartwise));
var result = (ScorePartwise)xmlSerializer.Deserialize(fileStream);
}
区分这两种方言的最佳方法是什么?
【问题讨论】:
-
xml 文件有多大?
-
这真的取决于作品,Palestrina 的四个声音的平均主题歌大约有 12000 行/300 KB。一整部交响乐肯定不止这些。
-
好的,我将文件的第 3 行加载到一个字符串中,然后执行
String.IndexOf()以按时间或按时间搜索,然后您就知道您正在处理的文件类型和可以选择正确的序列化器。 -
我不知道自然界中有多少(任何)分数时间文件,所以大多数系统这样做的一种方法就是假设分数部分。这似乎是一个逃避的答案,但我认为这几乎总是人们所做的。
标签: c# xml deserialization xmlserializer musicxml