在 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<String>
;你可以有一个List<Genre>
来构建一个镜像你的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 数组并将其放入模型类中