Flutter XML解析插件training_center_xml的使用

Flutter XML解析插件training_center_xml的使用

Training Center XML

此包旨在使 Dart 和 Flutter 中处理 Training Center XML 文件(.tcx)变得简单。

特性

此包可以用于:

  • 读取并打印 .tcx 文件的数据。
  • 读取、修改并写回 .tcx 文件的数据。
  • 从零创建一个新的 .tcx 文件。

开始使用

要使用此包,将其添加到您的 pubspec.yaml 文件中:

dependencies:
  training_center_xml: <latest_version>

或者运行以下命令:

flutter pub add training_center_xml

使用方法

哲学

该包的目标是模仿 TCX 文件的结构,其 XML 模式定义文件可在此处找到:https://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd

因此,类结构可能显得有些晦涩或奇怪,但这是为了匹配模式定义。

对于某些字段,模式定义的要求如下:

  • 如果模式期望恰好一个字段:TcxType field;
  • 如果模式期望零个或一个字段:TcxType? field;
  • 如果模式期望零个或多个字段:List<TcxType>? field;
  • 如果模式期望一个或多个字段:List<TcxType> field;

读取文件

以下代码展示了如何从文件中读取 .tcx 数据:

final myTcxString = File('my_tcx_file.tcx').readAsStringSync();
var tcx = TcxTrainingCenterDatabase.fromXmlString(myTcxString);

修改文件

虽然可以修改的字段很多,这里仅展示一个简单的例子:将文件中第一个活动的运动类型更改为跑步。大多数文件只有一个活动,但根据 TCX 标准,可以有多个活动:

tcx.activities?.activity?.firstOrNull?.sport = TcxSport.running;

写回文件

以下是将修改后的数据写回文件的代码:

File('my_tcx_file_edited.tcx').writeAsStringSync(tcx.toXmlString());

创建新的 .tcx 文件

以下是一个简单的示例,用于从零开始创建一个新的 .tcx 文件。在实际应用中,通常会有更多的数据,例如更多的轨迹点和更长的活动。

var newTcx = TcxTrainingCenterDatabase(
    activities: TcxActivityList(
      activity: [
        TcxActivity(
          id: DateTime(2023, 08, 21, 18, 30), // 设置活动的开始时间
          lap: [
            TcxActivityLap(
              calories: 12, // 卡路里消耗
              distanceMeters: 150, // 距离(米)
              intensity: TcxIntensity.active, // 强度
              startTime: DateTime(2023, 08, 21, 18, 30), // 活动开始时间
              totalTimeSeconds: 120, // 总时长(秒)
              triggerMethod: TcxTriggerMethod.manual, // 触发方式
              track: [
                TcxTrack(
                  trackpoint: [
                    TcxTrackpoint(
                      time: DateTime(2023, 08, 21, 18, 30, 1), // 轨迹点的时间
                      distanceMeters: 1, // 距离(米)
                      heartRateBpm: TcxHeartRateInBeatsPerMinute(value: 90), // 心率
                      altitudeMeters: 56, // 高度(米)
                      position: TcxPosition(
                        latitudeDegrees: 0.0, // 纬度
                        longitudeDegrees: 0.0, // 经度
                      ),
                    ),
                    TcxTrackpoint(
                      time: DateTime(2023, 08, 21, 18, 30, 31), // 轨迹点的时间
                      distanceMeters: 10, // 距离(米)
                      heartRateBpm: TcxHeartRateInBeatsPerMinute(value: 100), // 心率
                      altitudeMeters: 57, // 高度(米)
                      position: TcxPosition(
                        latitudeDegrees: 0.1, // 纬度
                        longitudeDegrees: 0.2, // 经度
                      ),
                    ),
                  ],
                ),
              ],
              extensions: TcxExtensions(
                activityLapExtension: [
                  TcxActivityLapExtension(
                    maxRunCadence: 12, // 最大步频
                    avgSpeed: 40, // 平均速度
                  ),
                ],
              ),
            ),
          ],
          sport: TcxSport.running, // 运动类型
        ),
      ],
    ),
  );

// 将新创建的 TCX 文件写入磁盘
File('my_new_tcx_file.tcx').writeAsStringSync(newTcx.toXmlString());

其他信息

Bug 报告

如果发现任何问题、错误或缺失的功能,请在 此存储库 提交新问题。

此包最初是为 Movna(一个用 Flutter 编写的开源训练应用程序)开发的。如果您喜欢的功能缺失,请随时贡献!


关于 TCX 扩展

TCX 模式定义允许来自其他模式的自定义扩展。遗憾的是,目前还不可能将任意类放入 <code>TcxExtensions</code> 的字段中,但 Garmin 发布的两个扩展 <code>ActivityLapExtension</code><code>ActivityTrackpointExtension</code> 已被支持。如果您知道尚未支持的公共 TCX 扩展,请提交问题!


如何构建

如果您希望自行构建此包或进行贡献,请按以下步骤设置环境:

确保安装了 FVM。在 Android Studio 中,可以将项目的 Flutter SDK 路径设置为 <absolute/path/to/this/repository/.fvm/flutter_sdk/>。所有后续的 flutter 命令实际上是调用 fvm flutter

安装所有依赖项:

flutter pub get

运行可用的测试:

flutter test

更多关于Flutter XML解析插件training_center_xml的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter XML解析插件training_center_xml的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你想解析XML数据,可以使用一些第三方插件来实现。training_center_xml 是一个专门用于解析和生成 Training Center XML (TCX) 文件的插件。TCX 是一种用于存储运动数据的XML格式,通常用于健身追踪器和运动应用程序。

以下是如何使用 training_center_xml 插件来解析和生成 TCX 文件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 training_center_xml 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  training_center_xml: ^1.0.0  # 请确保使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 解析TCX文件

假设你有一个TCX文件,你可以使用 TrainingCenterDocument 类来解析它。

import 'package:training_center_xml/training_center_xml.dart';
import 'dart:io';

void parseTcxFile(String filePath) async {
  final file = File(filePath);
  final xmlString = await file.readAsString();

  final tcxDocument = TrainingCenterDocument.fromXml(xmlString);

  // 访问解析后的数据
  for (var activity in tcxDocument.activities) {
    print('Activity ID: ${activity.id}');
    for (var lap in activity.laps) {
      print('Lap Start Time: ${lap.startTime}');
      for (var trackPoint in lap.trackPoints) {
        print('TrackPoint Time: ${trackPoint.time}');
        print('TrackPoint Latitude: ${trackPoint.position.latitude}');
        print('TrackPoint Longitude: ${trackPoint.position.longitude}');
        print('TrackPoint Altitude: ${trackPoint.altitude}');
        print('TrackPoint Heart Rate: ${trackPoint.heartRate}');
      }
    }
  }
}

3. 生成TCX文件

你也可以使用 TrainingCenterDocument 类来生成TCX文件。

import 'package:training_center_xml/training_center_xml.dart';
import 'dart:io';

void generateTcxFile(String filePath) async {
  final tcxDocument = TrainingCenterDocument(
    activities: [
      Activity(
        id: DateTime.now(),
        laps: [
          Lap(
            startTime: DateTime.now(),
            trackPoints: [
              TrackPoint(
                time: DateTime.now(),
                position: Position(latitude: 37.7749, longitude: -122.4194),
                altitude: 10.0,
                heartRate: 80,
              ),
              // 添加更多的TrackPoint
            ],
          ),
          // 添加更多的Lap
        ],
      ),
      // 添加更多的Activity
    ],
  );

  final xmlString = tcxDocument.toXmlString();
  final file = File(filePath);
  await file.writeAsString(xmlString);
}

4. 使用示例

你可以将上述代码集成到你的Flutter应用中。例如,你可以在一个按钮的点击事件中调用 parseTcxFilegenerateTcxFile 函数。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('TCX Parser Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              parseTcxFile('path/to/your/tcx/file.tcx');
              // 或者生成TCX文件
              // generateTcxFile('path/to/save/your/tcx/file.tcx');
            },
            child: Text('Parse TCX File'),
          ),
        ),
      ),
    );
  }
}
回到顶部