[英]How to use Microsoft xsd.exe with TrainingCenterDatabasev2 Schema?
我有使用https://www8.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd 上的模式编写的 TCX 练习文件。 我多年来一直在 Java 和 JAXB 中使用它们。 我正在尝试编写一个 C# 应用程序来做同样的事情。 进展不顺利。 我可以使用 Visual Studio 提供的 xsd.exe 生成 C# 类。 但是,它们对我没有意义,不能用于反序列化我的 TCX 文件。
TCX 文件的基本结构(至少是我感兴趣的部分)是它们有许多活动,其中包含许多圈数,其中包含许多包含许多轨迹点的轨迹。 Trackpoints 以纬度、经度和心率为主要关注项。
xsd 生成的 C# 类有一个 Activity_t[]、一个 ActivityLap_t[] 和一个 Trackpoint_t[][]。 没有 Track_t[] 并且字符串 Track_t 没有出现在文件中,即使它在 .xsd 中,例如在这个圈和赛道的摘录中。
<xsd:complexType name="ActivityLap_t">
<xsd:sequence>
<xsd:element name="TotalTimeSeconds" type="xsd:double"/>
<xsd:element name="DistanceMeters" type="xsd:double"/>
<xsd:element name="MaximumSpeed" type="xsd:double" minOccurs="0"/>
<xsd:element name="Calories" type="xsd:unsignedShort"/>
<xsd:element name="AverageHeartRateBpm" type="HeartRateInBeatsPerMinute_t" minOccurs="0"/>
<xsd:element name="MaximumHeartRateBpm" type="HeartRateInBeatsPerMinute_t" minOccurs="0"/>
<xsd:element name="Intensity" type="Intensity_t"/>
<xsd:element name="Cadence" type="CadenceValue_t" minOccurs="0"/>
<xsd:element name="TriggerMethod" type="TriggerMethod_t"/>
<xsd:element name="Track" type="Track_t" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="Notes" type="xsd:string" minOccurs="0"/>
<xsd:element name="Extensions" type="Extensions_t" minOccurs="0">
<xsd:annotation>
<xsd:documentation>You can extend Training Center by adding your own elements from another schema here.</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="StartTime" type="xsd:dateTime" use="required"/>
</xsd:complexType>
<xsd:complexType name="Track_t">
<xsd:sequence>
<xsd:element name="Trackpoint" type="Trackpoint_t" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
我不明白如何处理 [][] 也不明白为什么会生成它。 如前所述,它无法解析。
错误 CS0030:无法将类型“TrainingCenterDatabaseV2.Trackpoint_t[] 转换为 TrainingCenterDatabaseV2.Trackpoint_t。
(我使用的命名空间是 TrainingCenterDatabaseV2。)
这是用于反序列化的代码:
private const string NS_TrainingCenterDatabase_v2 = "http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2";
XmlSerializer xmlSerializer = new XmlSerializer(typeof(TrainingCenterDatabase_t),
NS_TrainingCenterDatabase_v2);
FileStream fs = new FileStream(fileName, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
TrainingCenterDatabase_t tcx = (TrainingCenterDatabase_t)xmlSerializer.Deserialize(reader);
不知道该去哪里,我尝试了 Visual Studio 插件 xsd2code++。 这将生成具有 List<Activity_t>、List<ActivityLap_t> 和 List<Trackpoint_t> 的合理 C# 类。 它也没有Track_t,这似乎有些多余。
但是,它也无法解析。 我认为,与 xsd.exe 生成的注释相比,这里的问题与它生成的注释缺乏有关。 我相信问题在于它无法处理没有这些注释的命名空间,但我没有看到设置选项来解决这个问题。 如前所述,我对 C# 中的反序列化没有经验。 对于我目前的目的,我使用 XDocument 而不是反序列化来实现读取 TCX 文件。 但是,我很好奇为什么我尝试的方法不起作用,尤其是因为 xsd.exe 已经存在很长时间了。
提前致谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.