ZetCode

Dart XML

最后修改日期:2024 年 1 月 28 日

在本文中,我们将展示如何在Dart语言中使用XML数据。我们读取和构建XML数据。

可扩展标记语言(XML)是一种标记语言,它定义了一套规则,用于将文档编码成人类可读且机器可读的格式。XML通常用于应用程序配置、数据存储和交换。

XML与HTML类似,但没有预定义的标签;我们可以设计自己的标签。

在Dart中,我们使用package:xml/xml.dart来处理XML。

$ dart pub add xml

我们将该包添加到项目结构中。

Dart XML简单示例

在第一个示例中,我们使用XmlDocument.parse从字符串中读取XML数据。该方法为给定的输入字符串返回一个XmlDocument

simple.dart
import 'package:xml/xml.dart';

void main() {
  var data = '''<?xml version="1.0" encoding="utf-8"?>
<value>6</value>''';

  var xdoc = XmlDocument.parse(data);

  print(xdoc);

  print('------------------');

  print(xdoc.findAllElements('value').first);
}

该示例解析XML数据,并将整个文档打印到终端。我们还找到value元素并打印它。

$ dart simple.dart
<?xml version="1.0" encoding="utf-8"?>
<value>6</value>
------------------
<value>6</value>

Dart从文件读取XML

在下一个示例中,我们从文件中读取XML数据。

books.xml
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
    <book genre='Science Fiction'>
        <title>Dune</title>
        <author>Frank Herbert</author>
        <price>8.99</price>
    </book>
    <book genre='Novel'>
        <title>Old Goriot</title>
        <author>Honoré de Balzac</author>
        <price>9.0</price>
    </book>
</bookstore>

我们有这个books.xml文件。

read_file.dart
import 'dart:io';

import 'package:xml/xml.dart';

void main() {
  var file = new File('books.xml');
  String data = file.readAsStringSync();

  var xdoc = XmlDocument.parse(data);

  print(xdoc);
}

我们导入dart:io包,并使用FilereadAsStringSync方法读取文件内容。

var xdoc = XmlDocument.parse(data);

我们使用XmlDocument.parse将数据解析为XML文档。

$ dart read_file.dart
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
    <book genre='Science Fiction'>
        <title>Dune</title>
        <author>Frank Herbert</author>
        <price>8.99</price>
    </book>
    <book genre='Novel'>
        <title>Old Goriot</title>
        <author>Honoré de Balzac</author>
        <price>9.0</price>
    </book>
</bookstore>

Dart XML where

where方法从文档中返回一个惰性可迭代对象,该对象满足给定的谓词。

where_fun.dart
import 'dart:io';

import 'package:xml/xml.dart';

void main() async {
  var file = new File('books.xml');
  String data = file.readAsStringSync();

  var xdoc = XmlDocument.parse(data);

  xdoc.descendants
      .where((e) => e.getAttribute('genre') == 'Novel')
      .forEach(print);
}

我们遍历后代元素,获取所有包含genre属性的元素。

$ dart where_fun.dart
<book genre='Novel'>
    <title>Old Goriot</title>
    <author>Honoré de Balzac</author>
    <price>9.0</price>
</book>

Dart XML findAllElements

findAllElements方法以文档顺序返回具有指定标签名称的递归子元素的惰性可迭代对象。

find_all.dart
import 'dart:io';

import 'package:xml/xml.dart';

void main() async {
  var file = new File('books.xml');
  String data = file.readAsStringSync();

  var xdoc = XmlDocument.parse(data);
  var books = xdoc.findAllElements('book');

  books
      .map((e) => e.text.trim().replaceAll(RegExp(r'\s+'), ' '))
      .forEach((e) => print("$e "));

  print('----------------');

  books.map((e) => e.findAllElements('title').single.text).forEach(print);
}

在该示例中,我们首先查找所有图书元素中的文本数据,然后查找所有标题。

$ dart find_all.dart 
Dune Frank Herbert 8.99 
Old Goriot Honoré de Balzac 9.0 
----------------
Dune
Old Goriot

Dart构建XML文档

可以使用XmlBuilder构建XML文档。

builder.dart
import 'package:xml/xml.dart';

void main() {
  var xdoc = buildXml();
  print(xdoc.toXmlString(pretty: true, indent: '  '));
}

XmlDocument buildXml() {
  var builder = new XmlBuilder();
  builder.processing('xml', 'version="1.0" encoding="utf-8"');
  builder.element('bookstore', nest: () {
    builder.element('book', nest: () {
      builder.attribute('genre', 'Science Fiction');
      builder.element('title', nest: 'Dune');
      builder.element('author', nest: 'Frank Herbert');
      builder.element('price', nest: 8.99);
    });

    builder.element('book', nest: () {
      builder.attribute('genre', 'Novel');
      builder.element('title', nest: 'Old Goriot');
      builder.element('author', nest: 'Honoré de Balzac');
      builder.element('price', nest: 9.0);
    });
  });

  return builder.buildDocument();
}

该示例创建了一个书店XML文档。

var builder = new XmlBuilder();

我们创建XmlBuilder的一个实例。

builder.element('bookstore', nest: () {
    builder.element('book', nest: () {
        builder.attribute('genre', 'Science Fiction');
        builder.element('title', nest: 'Dune');
        builder.element('author', nest: 'Frank Herbert');
        builder.element('price', nest: 8.99);
    });

使用element创建一个新元素。嵌套元素通过nest属性创建。

return builder.buildDocument();

使用buildDocument完成文档构建。

$ dart builder.dart 
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
    <book genre="Science Fiction">
    <title>Dune</title>
    <author>Frank Herbert</author>
    <price>8.99</price>
    </book>
    <book genre="Novel">
    <title>Old Goriot</title>
    <author>Honoré de Balzac</author>
    <price>9.0</price>
    </book>
</bookstore>

来源

Dart xml库文档

在本文中,我们已在Dart中处理了XML数据。

作者

我叫Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。我从2007年开始撰写编程文章。至今,我已撰写了1400多篇文章和8本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 Dart 教程