Flutter XML解析插件instant_xml_parser的使用

Flutter XML解析插件instant_xml_parser的使用

需要解析一些复杂的XML吗?

  1. 编写一组类来列出您要提取的值。
  2. 使用匹配的 [@tag](/user/tag)() 注解每个类。
  3. 根据需要注解字段(例如,当字段名与其属性名不匹配时)。
  4. 运行生成器。
  5. 使用您新创建的解析器。

这在处理复杂的XML(如 cough OOXML cough)并希望导入数据时特别有用。

使用方法

您的源代码

import 'package:ixp_runtime/annotations.dart';

[@tag](/user/tag)('ContactInfo')
class ContactInfo {
  final String email;
  final String phone;
  @textElement
  final String notes;

  ContactInfo(this.email, {this.phone, this.notes = ''});
}

[@tag](/user/tag)('addressBook')
class AddressBook {
  final List<ContactInfo> contacts;

  AddressBook(this.contacts);
}

pubspec.yaml

name: example
description: Annotates data classes for XML deserialization

environment:
  sdk: '>=3.4.0 <3.0.0'

dependencies:
  ixp_runtime: ^1.2.1
  logging: ^1.2.0
  xml: ^4.4.0

dev_dependencies:
  build_runner: ^2.4.11
  build_test: ^2.2.2
  instant_xml_parser: ^1.2.1
  test: ^1.25.8

从命令行生成您的解析器

dart run build_runner build  --delete-conflicting-outputs

您还可以监视源文件:

dart run build_runner watch  --delete-conflicting-outputs

XML

<addressBook>
  <ContactInfo email="alice@example.com">Birthday: April 1</ContactInfo>
  <ContactInfo email="bob@example.com">Birthday: Oct 31</ContactInfo>
</addressBook>

解析

import 'package:async/async.dart';
import 'package:example/example.dart';
import 'package:xml/xml_events.dart';

StreamQueue<XmlEvent> _eventsFrom(String xml) => StreamQueue(Stream.value(xml)
    .toXmlEvents()
    .withParentEvents()
    .normalizeEvents()
    .flatten());

final events = _eventsFrom(
        '<addressBook><ContactInfo email="alice@example.com">Birthday: April 1</ContactInfo><ContactInfo email="bob@example.com">Birthday: Oct 31</ContactInfo></addressBook>');
final addressBook = await extractAddressBook(events);

特性

  • 属性:非类字段读取为属性(隐式或显式转换自字符串)。 若要从属性加载类,请确保该类具有从字符串实例化的静态方法(例如 static Foo parse(String s)),并用 @convert('Foo.parse') 注解字段。
  • 文本:用 @textElement 注解字段以读取其XML文本。
  • :用 [@tag](/user/tag)('qualified_name') 注解类定义以生成解析方法。
  • :引用其他类的类会自动调用该解析方法。
  • 子类:子类实现不同的标签(例如,如果字段可以包含 <a1><a2><a3>,给这些一个公共超类并使用它)。
  • 字段作为属性:可以通过将字段标记为可选或在构造函数中提供默认值来定义可选属性。

示例

[@tag](/user/tag)('identification')
class NameTag {
  final String name;
  final String? nickname; // 可选属性
  final int id; // 带有默认值 -1 的可选属性(参见构造函数)
  final bool registered;

  NameTag(this.name, this.nickname, this.registered, [this.id = -1]);
}

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

1 回复

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


当然,以下是如何在Flutter中使用instant_xml_parser插件来解析XML数据的示例代码。这个插件可以帮助你将XML数据转换成Dart对象,便于在Flutter应用中处理。

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

dependencies:
  flutter:
    sdk: flutter
  instant_xml_parser: ^x.y.z  # 替换为最新版本号

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

接下来是一个简单的示例,展示如何使用instant_xml_parser解析XML数据:

示例XML数据

假设我们有一个简单的XML数据,如下所示:

<note>
    <to>User</to>
    <from>Admin</from>
    <heading>Reminder</heading>
    <body>Don't forget to check your tasks</body>
</note>

Flutter代码

  1. 创建一个数据模型
import 'package:instant_xml_parser/instant_xml_parser.dart';

@XmlSerializable()
class Note {
  @XmlElement(name: 'to')
  String? to;

  @XmlElement(name: 'from')
  String? from;

  @XmlElement(name: 'heading')
  String? heading;

  @XmlElement(name: 'body')
  String? body;

  Note({this.to, this.from, this.heading, this.body});

  factory Note.fromXml(XmlElement element) => _$NoteFromXml(element);

  XmlElement toXml() => _$NoteToXml(this);
}

注意:@XmlSerializable()和相关的注解需要build_runner来生成代码。运行以下命令生成代码:

flutter pub run build_runner build
  1. 解析XML数据
import 'package:flutter/material.dart';
import 'package:instant_xml_parser/instant_xml_parser.dart';
import 'dart:convert';
import 'note_model.dart';  // 假设你的数据模型文件名为note_model.dart

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('XML Parser Demo'),
        ),
        body: Center(
          child: FutureBuilder<Note?>(
            future: _parseXml(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                } else if (snapshot.data == null) {
                  return Text('No data');
                } else {
                  Note note = snapshot.data!;
                  return Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Text('To: ${note.to}'),
                      Text('From: ${note.from}'),
                      Text('Heading: ${note.heading}'),
                      Text('Body: ${note.body}'),
                    ],
                  );
                }
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }

  Future<Note?> _parseXml() async {
    String xmlData = '''
    <note>
        <to>User</to>
        <from>Admin</from>
        <heading>Reminder</heading>
        <body>Don't forget to check your tasks</body>
    </note>
    ''';

    XmlDocument xmlDocument = XmlDocument.parse(xmlData);
    XmlElement rootElement = xmlDocument.rootElement;

    return Note.fromXml(rootElement);
  }
}

在这个示例中,我们定义了一个Note类来表示XML数据的结构,并使用instant_xml_parser插件提供的注解和函数来解析XML数据。FutureBuilder用于异步加载和显示解析后的数据。

确保你已经正确安装了所有依赖并运行了代码生成命令。这个示例展示了如何使用instant_xml_parser在Flutter应用中解析XML数据并显示解析后的内容。

回到顶部