[英]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.