Как использовать Microsoft xsd.exe со схемой TrainingCenterDatabasev2? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть файлы упражнений 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 существует уже давно.

Заранее спасибо.

1 Ответ

1 голос
/ 12 марта 2020

Похоже, что это ошибка самого инструмента xsd.exe. Я бы порекомендовал использовать LinqToXsd (требуется. NET Core 2.1), которая является другой разработанной Microsoft технологией для доступа к данным XML с использованием XSD; он также более продвинут, чем xsd.exe, и в моем быстром тестировании, кажется, полностью обрабатывает вышеуказанную схему базы данных учебного центра Garmin без проблем.

Также, если вы не можете установить. NET Core на вашем компьютере, вы можете использовать этот пакет nuget . . NET Базовая версия требует. NET Core 2.1 для фактического генерирования кода, но этот сгенерированный код, который можно использовать в целевом приложении. NET Framework 4.6.2 и выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...