取り合えずメモ。誤解も勘弁。
Dartでxmlを扱いたい。xmlパッケージがある。しかしドキュメントは当然ながら英語。いまいち使い方がよくわからない。
そんな中を手探りで見つけたXMLをSAXで解析するスッキリな方法のメモです。
インポート
import 'package:xml/xml_events.dart';
XMLデータ
final bookshelfXml = '''<?xml version="1.0"?>
<bookshelf>
<book>
<title lang="english">Growing a Language</title>
<price>29.99</price>
</book>
<book>
<title lang="english">Learning XML</title>
<price>39.95</price>
</book>
<price>132.00</price>
</bookshelf>''';
処理
await Stream.fromIterable(parseEvents(bookshelfXml))
.forEachEvent(onStartElement:(e) => print(e));
結果
<bookshelf>
<book>
<title lang="english">
<price>
<book>
<title lang="english">
<price>
<price>
Stream<XmlEvent>の拡張関数としてforEachEventが書かれているようでonStartElement以外にonEndElementなどなど必要そうなものがあります。
でも結局...
以下のようにbook内のことを処理するにはよくわからんかったから私は原始的な方法で使うことにしました。だって趣味だしどうせ趣味だし。
コード
var it = parseEvents(bookshelfXml);
var iterator = it.iterator;
while (iterator.moveNext()) {
var v = iterator.current;
if (v is XmlStartElementEvent) {
if (v.name == 'book') {
print("Start:book");
while (iterator.moveNext()) {
var e = iterator.current;
if (e is XmlEndElementEvent && e.name == "book") {
print("End:book");
break;
} else {
print(e.nodeType);
}
}
}
}
}
結果
Start:book
XmlNodeType.TEXT
XmlNodeType.ELEMENT
XmlNodeType.TEXT
XmlNodeType.ELEMENT
XmlNodeType.TEXT
XmlNodeType.ELEMENT
XmlNodeType.TEXT
XmlNodeType.ELEMENT
XmlNodeType.TEXT
End:book
Start:book
XmlNodeType.TEXT
XmlNodeType.ELEMENT
XmlNodeType.TEXT
XmlNodeType.ELEMENT
XmlNodeType.TEXT
XmlNodeType.ELEMENT
XmlNodeType.TEXT
XmlNodeType.ELEMENT
XmlNodeType.TEXT
End:book
きれいに書けんものか...(TT)