xml - 解析多状态响应的性能不佳
问题描述
我正在使用 xml 库来解析多状态响应。该代码需要花费很多秒来解析一个简单的 xml。我可以做些什么来提高性能?我不能在工厂中使用异步代码。
我对 xml 库的解析速度感到惊讶,而且没有任何异步代码。我试图分析库的代码以将其作为我可以做什么的示例,但我无法理解。
import 'package:xml/xml.dart';
class MultiStatus {
final List<Response> response;
final String? syncToken;
MultiStatus({required this.response, this.syncToken});
factory MultiStatus.fromXml(XmlDocument element) {
var response = <Response>[];
var multistatus = element.firstElementChild;
if (multistatus!.name.local == 'multistatus') {
var elements = multistatus.children.whereType<XmlElement>();
// add responses
elements
.where((element) => element.name.local == 'response')
.forEach((element) {
response.add(Response.fromXml(element));
});
try {
var syncToken = elements
.firstWhere((element) => element.name.local == 'sync-token');
return MultiStatus(response: response, syncToken: syncToken.text);
} catch (e) {
return MultiStatus(response: response);
}
}
throw Error();
}
factory MultiStatus.fromString(String string){
var document = XmlDocument.parse(string);
return MultiStatus.fromXml(document);
}
}
class Response {
final String href;
final Propstat propstat;
Response({required this.href, required this.propstat});
factory Response.fromXml(XmlElement element) {
if (element.name.local == 'response') {
var elements = element.children.whereType<XmlElement>();
var href =
elements.firstWhere((element) => element.name.local == 'href').text;
var propstatXml =
elements.firstWhere((element) => element.name.local == 'propstat');
return Response(href: href, propstat: Propstat.fromXml(propstatXml));
}
throw Error();
}
}
class Propstat {
final Map<String, dynamic> prop;
final int status;
Propstat({required this.prop, required this.status});
factory Propstat.fromXml(XmlElement element) {
if (element.name.local == 'propstat') {
var prop = <String, dynamic>{};
var elements = element.children.whereType<XmlElement>();
var props = elements
.firstWhere((element) => element.name.local == 'prop')
.children
.whereType<XmlElement>();
props.forEach((element) {
var value = element.text.isNotEmpty
? element.text
: element.children.whereType<XmlElement>();
prop[element.name.local] = value;
});
var status = elements
.firstWhere((element) => element.name.local == 'status')
.text
.split(' ')[1];
return Propstat(prop: prop, status: int.parse(status));
}
throw Error();
}
@override
String toString() {
var string = '';
prop.forEach((key, value) {
var valueString = value.toString();
string += '$key: ${valueString.length > 200 ? '\n' : ''}$valueString';
});
return string;
}
}
解决方案
很难从您发布的代码中判断出什么问题。
您能否分享以下一项或多项详细信息?
- 运行时的配置文件转储(让我弄清楚时间花在了哪里);
- 提供一个包含输入数据的可运行(理想情况下是最小的)示例;
- 如果不可能,至少提供输入数据的一些定量信息(文件大小、文件结构、不同部分的大小、元素数量;数据如何加载;...);
- 提供有关您运行代码的设备/机器的信息;
- 等等
推荐阅读
- javascript - 如何使用输入和 javascript 函数重复 HTML 代码
- html - Html 按钮打桩
- matlab - 比较两个大小不兼容的数据集并删除匹配的数据
- r - 没有geom的ggforce注释?
- android - 调试 Exoplayer ERROR_CODE_IO_UNSPECIFIED
- c++ - 在 Dosbox 中安装鼠标导致段错误
- flutter - 我怎样才能透明的textformfield?
- android - 从通知启动活动时显示空白白屏
- javascript - Javascript If /if else/ else - 不确定使用什么
- asp.net-core - 验证多个 WS 联合