在Dart和Flutter项目开发中,经常会遇到需要处理XML格式数据的场景,比如对接返回XML格式的第三方接口、读取本地XML配置文件等,使用xml package可以快速完成XML数据的解析操作。

xml package的导入与基础准备
首先需要在项目的pubspec.yaml文件中添加xml package的依赖,然后执行依赖安装命令即可完成准备工作。
dependencies:
flutter:
sdk: flutter
xml: ^6.3.0
安装完成后,在需要解析XML的Dart文件中导入对应的包:
import 'package:xml/xml.dart' as xml;
解析XML字符串的基础用法
xml package提供了parse方法,可以直接将XML格式的字符串转换为可操作的对象,之后就可以通过对应的方法获取节点、属性等信息。
简单XML解析示例
以下是一个简单的XML字符串解析示例,演示如何获取根节点、子节点内容:
void parseSimpleXml() {
// 待解析的XML字符串
String xmlStr = '''<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>张三</name>
<age>25</age>
<email>test@ipipp.com</email>
</user>''';
// 解析XML字符串
final document = xml.XmlDocument.parse(xmlStr);
// 获取根节点
final root = document.rootElement;
print('根节点名称:${root.name}'); // 输出:根节点名称:user
// 获取子节点内容
final nameNode = root.findElements('name').first;
print('姓名:${nameNode.innerText}'); // 输出:姓名:张三
final ageNode = root.findElements('age').first;
print('年龄:${ageNode.innerText}'); // 输出:年龄:25
final emailNode = root.findElements('email').first;
print('邮箱:${emailNode.innerText}'); // 输出:邮箱:test@ipipp.com
}
获取节点属性
如果XML节点包含属性,可以通过getAttribute方法获取对应属性的值,示例如下:
void parseXmlWithAttribute() {
String xmlStr = '''<?xml version="1.0" encoding="UTF-8"?>
<book id="1001" category="编程">
<title>Dart开发实战</title>
<author>李四</author>
</book>''';
final document = xml.XmlDocument.parse(xmlStr);
final root = document.rootElement;
// 获取节点属性
final bookId = root.getAttribute('id');
final bookCategory = root.getAttribute('category');
print('书籍ID:$bookId,分类:$bookCategory'); // 输出:书籍ID:1001,分类:编程
// 获取子节点内容
final title = root.findElements('title').first.innerText;
final author = root.findElements('author').first.innerText;
print('书名:$title,作者:$author'); // 输出:书名:Dart开发实战,作者:李四
}
遍历XML子节点
当XML节点包含多个同级的子节点时,可以通过findElements方法获取所有同名的子节点,然后进行遍历处理。
void traverseXmlNodes() {
String xmlStr = '''<?xml version="1.0" encoding="UTF-8"?>
<student_list>
<student>
<name>张三</name>
<score>90</score>
</student>
<student>
<name>李四</name>
<score>85</score>
</student>
<student>
<name>王五</name>
<score>95</score>
</student>
</student_list>''';
final document = xml.XmlDocument.parse(xmlStr);
final root = document.rootElement;
// 遍历所有student节点
final studentNodes = root.findElements('student');
for (var student in studentNodes) {
final name = student.findElements('name').first.innerText;
final score = student.findElements('score').first.innerText;
print('学生姓名:$name,成绩:$score');
}
}
解析本地XML文件
在Flutter项目中如果需要解析本地存放的XML文件,首先需要把XML文件放到项目的assets目录下,然后在pubspec.yaml中声明资源,最后通过rootBundle加载文件内容后再解析。
import 'package:flutter/services.dart' show rootBundle;
Future<void> parseLocalXml() async {
// 加载本地assets目录下的student.xml文件
final xmlStr = await rootBundle.loadString('assets/student.xml');
final document = xml.XmlDocument.parse(xmlStr);
// 后续解析逻辑和解析字符串一致
final root = document.rootElement;
print('本地XML根节点:${root.name}');
}
常见问题与注意事项
- 解析XML字符串时,如果字符串格式不符合XML规范,会抛出异常,建议解析时使用try-catch包裹代码处理异常。
- 获取节点内容时,如果节点不存在,
findElements返回的迭代器为空,直接调用first会报错,需要先判断是否存在对应节点。 - xml package解析后的节点内容默认是字符串类型,如果需要数值类型需要手动转换。
注意:处理XML数据时要确保数据来源可靠,避免解析恶意构造的XML数据导致安全问题。
DartFlutterxml_packageXML解析修改时间:2026-06-24 17:27:33