簡體   English   中英

如何將 Microsoft xsd.exe 與 TrainingCenterDatabasev2 架構一起使用?

[英]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 已經存在很長時間了。

提前致謝。

這似乎是xsd.exe工具本身的錯誤。 我建議使用LinqToXsd (需要 .NET Core 2.1),這是 Microsoft 開發的另一種使用 XSD 訪問 XML 數據的技術; 它也比xsd.exe更先進,並且在我的快速測試中似乎可以完全處理上述 Garmin 培訓中心數據庫架構而沒有問題。

此外,如果您無法在您的機器上安裝 .NET Core,您可以改用這個nuget 包 .NET Core 版本需要 .NET Core 2.1 才能實際生成代碼,但生成的代碼可用於面向 .NET Framework 4.6.2 及更高版本的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM