openplanning

Phân tích XML trong Dart

Xem thêm các chuyên mục:

Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook

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:
  • TODO Link?

<?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:
  • TODO Link?

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>

Xem thêm các chuyên mục:

Có thể bạn quan tâm

Đây là các khóa học trực tuyến bên ngoài website o7planning mà chúng tôi giới thiệu, nó có thể bao gồm các khóa học miễn phí hoặc giảm giá.