Flutter XML解析插件xml_parser的使用
Flutter XML解析插件xml_parser的使用
概述
xml_parser
是一个无意见的XML解析器,可以读取、遍历和写入XML文档。
使用方法
导入库
import 'package:xml_parser/xml_parser.dart';
解析XML文档
文档
XML文档可以从字符串中通过 XmlDocument.fromString
方法解析,或者从URI通过 XmlDocument.fromUri
方法解析。
示例代码:
String xmlString = '''
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE root SYSTEM "rootDtd" "dtd/root.dtd">
<root>
<element>Child 1</element>
<element>Child 2</element>
<element>Child 3</element>
</root>
''';
XmlDocument xmlDocument = XmlDocument.fromString(xmlString);
// 打印XML声明的相关信息
print(xmlDocument.xmlDeclaration.version); // 1.0
print(xmlDocument.xmlDeclaration.encoding); // UTF-8
print(xmlDocument.xmlDeclaration.standalone); // true
// 打印DOCTYPE声明的相关信息
print(xmlDocument.doctype.element); // root
print(xmlDocument.doctype.externalDtdUri); // dtd/root.dtd
// 打印根元素的子节点数量
print(xmlDocument.root.children.length); // 3
提取节点
在许多情况下,不需要解析整个XML文档。如果你知道文档的结构并且知道需要检索的数据位置,你可以只提取所需的节点而不必解析更多的文档内容。
每个XML节点类都有静态方法 fromString
和 parseString
。fromString
将解析输入字符串并返回其类型的第一节点,而 parseString
将返回找到的该类型的每个节点的列表。
示例代码:
/// 返回所有XML声明、DOCTYPE声明和元素
/// 忽略所有其他节点类型。
///
/// 只返回最高级别的节点。如果任何返回的
/// 节点有子节点,则无论类型如何都会解析所有子节点。
List<XmlNode> nodes = XmlNode.parseString(
xmlString,
returnNodesOfType: <Type>[XmlDeclaration, XmlDoctype, XmlElement],
);
遍历文档
XmlDocument
和每种可以包含子节点的节点类型将它们的子节点存储在 XmlNode
列表中。
由于XML节点有不同的属性,只有 toString
和 toFormattedString
方法对每个节点可用(更多细节见下文)。因此,所有其他的getter和方法都是特定于每个节点的。
示例代码:
String xmlString = '''
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE root SYSTEM "rootDtd" "dtd/root.dtd">
<root>
<element>Child 1</element>
<element>Child 2</element>
<element>Child 3</element>
</root>
''';
XmlDocument document = XmlDocument.fromString(xmlString);
for (XmlNode child in document.children) {
if (child is XmlDeclaration) {
print(child.version); // 1.0
} else if (child is XmlDoctype) {
print(child.externalDtdName); // rootDtd
} else if (child is XmlElement) {
print(child.name); // root
}
}
构建文档/节点
xml_parser
对构建文档和节点采取了放手的态度。没有提供构建方法。相反,XmlDocument
和所有可以包含子节点的节点将它们嵌套的节点存储在可修改的列表中。
示例代码:
XmlDocument xmlDocument = XmlDocument([
XmlDeclaration(version: '1.0', encoding: 'UTF-8'),
XmlElement(name: 'root', children: [
XmlElement(name: 'child', children: [XmlText('Child 1')]),
XmlElement(name: 'child', children: [XmlText('Child 2')]),
XmlElement(name: 'child', children: [XmlText('Child 3')]),
XmlElement(name: 'child', children: [XmlText('Child 4')]),
]),
]);
xmlDocument.root.children[2] = XmlComment('Child 3');
print(xmlDocument.writeToFile('document.xml'));
上述代码会将 document.xml
写入项目根目录为:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<child>Child 1</child>
<child>Child 2</child>
<!--Child 3-->
<child>Child 4</child>
</root>
写入文档/节点
XmlDocument
和每个节点都有 toString
和 toFormattedString
方法。
toString
输出没有换行符的未格式化XML代码。toFormattedString
格式化XML代码,在每个节点/元素处换行,并根据需要缩进每一行。(注意:toFormattedString
目前相当基础,我希望能添加更多格式选项)。
完整示例Demo
以下是一个完整的Flutter应用示例,演示如何使用 xml_parser
插件解析XML文档:
import 'package:flutter/material.dart';
import 'package:xml_parser/xml_parser.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'XML Parser Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _result = '';
void _parseXML() async {
String xmlString = '''
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE root SYSTEM "rootDtd" "dtd/root.dtd">
<root>
<element>Child 1</element>
<element>Child 2</element>
<element>Child 3</element>
</root>
''';
XmlDocument xmlDocument = XmlDocument.fromString(xmlString);
setState(() {
_result = 'XML Version: ${xmlDocument.xmlDeclaration.version}\n'
'Encoding: ${xmlDocument.xmlDeclaration.encoding}\n'
'Standalone: ${xmlDocument.xmlDeclaration.standalone}\n'
'Root Element Children Count: ${xmlDocument.root.children.length}';
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('XML Parser Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _parseXML,
child: Text('Parse XML'),
),
SizedBox(height: 20),
Text(
_result,
style: TextStyle(fontSize: 16),
textAlign: TextAlign.center,
),
],
),
),
);
}
}
更多关于Flutter XML解析插件xml_parser的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html