在 Dart / Flutter 中解析嵌套的 XML

Posted

技术标签:

【中文标题】在 Dart / Flutter 中解析嵌套的 XML【英文标题】:Parse nested XML in Dart / Flutter 【发布时间】:2020-11-29 14:33:02 【问题描述】:

我需要帮助解析 Dart/Flutter 中的嵌套 XML 文件。

我有一个飞镖课程

class Genre 
String id;
String title;
String token;
String type;
// For children objets I want to get list of IDs
// as String
List<String> subGenres;

XML 文件如下所示:

<genres>
  <genre id="5003" title="Бизнес-книги" type="root">
    <genre id="5049" title="Банковское дело" token="bankovskoe_delo" type="genre"/>
    <genre id="5047" title="Кадровый менеджмент" token="kadrovyj_menedzhment" type="container">
      <genre id="5334" title="Аттестация персонала" token="attestaciya_personala" type="genre"/>
      <genre id="5330" title="Гендерные различия" token="gendernyye_razlichiya" type="genre"/>
      <genre id="5332" title="Конфликты" token="konflikty" type="genre"/>
    </genre>
  </genre>
  <genre id="5013" title="Юмористическая литература" type="root">
    <genre id="5201" title="Анекдоты" token="anekdoty" type="genre"/>
    <genre id="5202" title="Зарубежный юмор" token="zarubezhnyy" type="genre"/>
  </genre>
</genres>

所以我可能有无限级别的子流派。 如果对象类型是“根”或“容器”,它包含子流派,类型“流派”是单个记录(如文件夹和文件)。

如何获取所有对象的列表并将其解析为类对象?

【问题讨论】:

【参考方案1】:

使用xml 包。我喜欢使用带有XmlElement 的工厂构造函数。没有理由为孩子们将自己限制在List&lt;String&gt;;你可以有一个List&lt;Genre&gt; 来构建一个镜像你的XML 的树。 (当然,如果您愿意,也可以这样做。)

请注意工厂构造函数如何遍历任何子 XML 元素,递归调用自身。 normal 构造函数是私有的,因此只有工厂构造函数使用它。如果一个流派没有子流派,则subGenres 列表isEmpty

import 'package:xml/xml.dart';

var sample = '''<?xml version="1.0" encoding="UTF-8"?>
<genres>
  <genre id="5003" title="Бизнес-книги" type="root">
    <genre id="5049" title="Банковское дело" token="bankovskoe_delo" type="genre"/>
    <genre id="5047" title="Кадровый менеджмент" token="kadrovyj_menedzhment" type="container">
      <genre id="5334" title="Аттестация персонала" token="attestaciya_personala" type="genre"/>
      <genre id="5330" title="Гендерные различия" token="gendernyye_razlichiya" type="genre"/>
      <genre id="5332" title="Конфликты" token="konflikty" type="genre"/>
    </genre>
  </genre>
  <genre id="5013" title="Юмористическая литература" type="root">
    <genre id="5201" title="Анекдоты" token="anekdoty" type="genre"/>
    <genre id="5202" title="Зарубежный юмор" token="zarubezhnyy" type="genre"/>
  </genre>
</genres>
''';

class Genre 
  Genre._(this.id, this.title, this.token, this.type, this.subGenres);

  factory Genre.fromElement(XmlElement genreElement) 
    return Genre._(
      genreElement.getAttribute('id'),
      genreElement.getAttribute('title'),
      genreElement.getAttribute('token'),
      genreElement.getAttribute('type'),
      genreElement
          .findElements('genre')
          .map<Genre>((e) => Genre.fromElement(e))
          .toList(),
    );
  

  String id;
  String title;
  String token;
  String type;
  List<Genre> subGenres;


void main() 
  var root = XmlDocument.parse(sample).getElement('genres');
  var rootGenres = root
      .findElements('genre')
      .map<Genre>((e) => Genre.fromElement(e))
      .toList();

  print(rootGenres);

【讨论】:

谢谢你,你拯救了我的一天。现在我需要了解如何将这些东西放到 firebase 中以在 ListViews 中显示))。我想我会将所有流派放在顶层,并通过父流派中的 ids 列表来处理子流派。 再次感谢您。在您的帮助下,我几乎完全完成了我的生产代码。我怎样才能接受堆栈中的答案?我还有一个关于颤振 xml 包的问题,​​如果你能帮助它会很酷 - ***.com/questions/63431246/…

以上是关于在 Dart / Flutter 中解析嵌套的 XML的主要内容,如果未能解决你的问题,请参考以下文章

如果 Flutter/Dart 中没有名称/键,如何序列化/解析嵌套的 JSON 数组

Android Studio 无法解析 dart 文件中的嵌套导入

使用 Dart 语言解析嵌套 JSON 数组并将其放入模型类中

Dart / Flutter 嵌套类静态访问

如何在Dart / flutter中映射和显示嵌套的JSON?

如何使用键路径从嵌套的字典dart中获取值。