在 Dart / Flutter 中解析嵌套 XML
Parse nested XML in Dart / Flutter
我需要帮助来解析 Dart/Flutter 中的嵌套 XML 文件。
我有飞镖class
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>
所以我可能有无限级别的子流派。
如果对象类型是 'root' 或 'container',它包含子流派,则类型 'genre' 是单个记录(如文件夹和文件)。
如何获取所有对象的列表并将其解析为 class 个对象?
使用 xml
包。我喜欢使用带有 XmlElement
的工厂构造函数。没有理由将自己限制在 children 的 List<String>
;你可以用 List<Genre>
来构建一棵反映你的 XML 的树。 (当然,如果您愿意,也可以这样做。)
注意工厂构造函数如何遍历任何 child XML 元素,递归地调用自身。 normal
构造函数是私有的,因此只有工厂构造函数使用它。如果流派没有 sub-genres,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);
}
我需要帮助来解析 Dart/Flutter 中的嵌套 XML 文件。
我有飞镖class
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>
所以我可能有无限级别的子流派。 如果对象类型是 'root' 或 'container',它包含子流派,则类型 'genre' 是单个记录(如文件夹和文件)。
如何获取所有对象的列表并将其解析为 class 个对象?
使用 xml
包。我喜欢使用带有 XmlElement
的工厂构造函数。没有理由将自己限制在 children 的 List<String>
;你可以用 List<Genre>
来构建一棵反映你的 XML 的树。 (当然,如果您愿意,也可以这样做。)
注意工厂构造函数如何遍历任何 child XML 元素,递归地调用自身。 normal
构造函数是私有的,因此只有工厂构造函数使用它。如果流派没有 sub-genres,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);
}