openplanning

Phân tích XML trong Dart

  1. Dart-XML
  2. Cài đặt thư viện
  3. Các loại đầu vào XML
  4. Ví dụ

1. Dart-XML

Dart-XML là một thư viện gọn nhẹ được sử dụng để phân tích cú pháp (parse), duyệt (traverse), truy vấn, biến đổi (transform) và xây dựng các tài liệu XML. Dart-xml là thư viện mã nguồn mở và phổ biến nhất trong số các thư viện tương tự dành cho Dart.
Mã nguồn của Dart-xml được duy trì trên GitHub:
Một thư viện khác tương tự là Dart xml_parser, ít phổ biến hơn một chút so với Dart-xml:
  • Dart XML parser
<?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>
Dart xml API tuân thủ các tiêu chuẩn W3C DOM, vì vậy sẽ rất dễ dàng để sử dụng nếu bạn đã từng làm việc với bất kỳ một thư viện nào tuân thủ theo tiêu chuẩn này trước đó (của bất kỳ ngôn ngữ nào).
W3C DOM là một mô hình dạng cây. Trong thư viện Dart xml, các lớp đại diện cho các Node của cây đều bắt đầu bởi tiếp đầu ngữ "Xml", chẳng hạn XmlDocument, XmlElement, XmlAttribute, XmlText,...

2. Cài đặt thư viện

Với các dự án Dart:
dart pub add xml
Với các dự án Flutter:
flutter pub add xml
Hoặc khai báo thư viện XML này trong file pubspec.yaml:
pubspec.yaml
dependencies:
  xml:

3. Các loại đầu vào XML

Trong thư viện Dart-xml, lớp XmlDocument đại diện cho một tài liệu XML. Lớp này cung cấp một constructor và một phương thức nhà máy tĩnh để tạo đối tượng XmlDocument.
factory XmlDocument.parse(String input, {XmlEntityMapping? entityMapping})  // Factory method

// Create a document node with `children`.
XmlDocument([Iterable<XmlNode> childrenIterable = const []]) // Constructor.
Phương thức nhà máy tĩnh XmlDocument.parse được sử dụng để phân tích cú pháp (parse) một văn bản XML và trả về một đối tượng XmlDocument, nếu văn bản không hợp lệ, XmlParserException sẽ được ném ra.
Đầu vào là một văn bản XML:
dart-xml-text-ex1.dart
import 'package:xml/xml.dart';
void main() {
  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>''';
  final document = XmlDocument.parse(bookshelfXml);
  var xml = document.toXmlString(pretty: true);
  print(xml);
}
Đầu vào là một file:
dart-xml-file-ex1.dart
import 'package:xml/xml.dart';
import 'dart:io';
void main() {
  var inputFile = File('./input/bookshelf.xml');
  var xmlText = inputFile.readAsStringSync();
  final document = XmlDocument.parse(xmlText);
  var xml = document.toXmlString(pretty: true);
  print(xml);
}
Đầu vào từ một URL:
dart-xml-url-ex1.dart
// Need to add http library to pubspec.yaml
// dependencies:
//    http:
import 'package:http/http.dart' as http;
import 'package:xml/xml.dart';
void main() async {
  var url = 'https://ex1.o7planning.com/testdata/dart/bookshelf.xml';
  var uri = Uri.parse(url); // Uri object.

  var xmlContent = await http.read(uri); // String
  final document = XmlDocument.parse(xmlContent);
  var xml = document.toXmlString(pretty: true);
  print(xml);
}
Xem thêm cách cài đặt và sử dụng thư viện Dart http:

4. Ví dụ

Ví dụ: Đọc nội dung tài liệu XML:
dart-xml-ex1.dart
import 'package:xml/xml.dart';

void main() {
  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>''';
  final document = XmlDocument.parse(bookshelfXml);
  var rootElement = document.rootElement;

  var priceElement = rootElement.getElement('price');
  print('BookShelf price: ${priceElement!.text}');
 
  var bookElements = rootElement.findElements('book'); // Iterable<XmlElement>

  for (var bookElement in bookElements) {
    var titleElement = bookElement.getElement('title');
    var priceElement = bookElement.getElement('price');
    var title = titleElement!.text; // String
    var lang = titleElement.getAttribute('lang'); // String
    var price = priceElement!.text; // String
    print('Book: ${title}, Language: ${lang}, price: ${price}');
  }
}
Output:
BookShelf price: 132.00
Book: Growing a Language, Language: english, price: 29.99
Book: Learning XML, Language: english, price: 39.95
Ví dụ: Sửa đổi tài liệu XML:
dart-xml-ex1.dart
import 'package:xml/xml.dart';

void main() {
  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>''';
  final document = XmlDocument.parse(bookshelfXml);
  var rootElement = document.rootElement;

  var bookElements = rootElement.findElements('book'); // Iterable<XmlElement>

  for (var bookElement in bookElements) {
    var titleElement = bookElement.getElement('title');
    var priceElement = bookElement.getElement('price');
    var title = titleElement!.text; // String
    titleElement.innerText = title.toUpperCase(); // Update text
    var lang = titleElement.getAttribute('lang'); // String
    titleElement.setAttribute('lang', lang!.toUpperCase());
    var price = double.parse(priceElement!.text); // double
    priceElement.innerText = (price * 2).toString();
  }
  print(document.toXmlString(pretty: true));
}
Output:
<?xml version="1.0"?>
<bookshelf>
  <book>
    <title lang="ENGLISH">GROWING A LANGUAGE</title>
    <price>59.98</price>
  </book>
  <book>
    <title lang="ENGLISH">LEARNING XML</title>
    <price>79.9</price>
  </book>
  <price>132.00</price>
</bookshelf>