У меня есть файлы упражнений TCX, которые написаны с использованием схемы в https://www8.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd. Я использую их годами с Java и JAXB. Я пытаюсь написать приложение C#, чтобы сделать то же самое. Это не идет хорошо. Я могу создавать C# классы, используя xsd.exe, как это предусмотрено Visual Studio. Тем не менее, они не имеют смысла для меня и не могут быть использованы для десериализации моих файлов TCX.
Базовая c структура файлов TCX (по крайней мере та часть, в которой я заинтересован) состоит в том, что они имеют ряд Деятельностей, содержащих количество кругов, содержащих количество треков, содержащих количество трекпоинтов. Трек-точки имеют широту, долготу и частоту сердечных сокращений в качестве основных элементов интереса.
Сгенерированные xsd C# классы имеют Activity_t [], ActivityLap_t [] и Trackpoint_t [] []. Track_t [] отсутствует, и строка Track_t не появляется в файле, даже если он находится в формате .xsd, например, в этом отрывке для Lap и Track.
<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);
Не зная, где go, я попробовал подключаемый модуль Visual Studio, xsd2code ++. Это создает разумные C# классы с List Список и список , Он также не имеет Track_t, что кажется несколько лишним.
Однако он также не может выполнить синтаксический анализ. Я полагаю, что проблемы здесь связаны с отсутствием аннотаций, которые он генерирует, по сравнению с теми, что генерируются из xsd.exe. Я считаю, что проблема в том, что он не может обрабатывать пространства имен без этих аннотаций, но я не видел способа установить параметры, чтобы обойти это. Как уже говорилось, у меня нет опыта десериализации в C#. Для моих текущих целей я реализовал чтение файлов TCX, используя XDocument, а не десериализацию. Однако мне любопытно, почему то, что я попробовал, не сработало, тем более что xsd.exe существует уже давно.
Заранее спасибо.