Flutter使用xml库解析XML时如何提取标签属性值生成指定结构
Flutter xml库提取标签属性生成目标结构方案
核心原因:你之前只拿到了Field节点对象,没有调用库提供的属性读取API,xml包内置了getAttribute方法可以直接读取尖括号内的标签属性,不需要手动解析字符串。
修改后的完整实现代码
import 'package:xml/xml.dart' as xml; import 'package:http/http.dart' as http; void main() async { String url = "http://erp.nb-jf.com/web/ws/r/aws_ttsrv2?wsdl"; String xmlReq = ''' '''; http.Response response = await http.post( Uri.parse("http://erp.nb-jf.com/web/ws/r/aws_ttsrv2?wsdl"), headers: { 'Content-Type': "text/xml; charset=UTF-8", 'SOAPAction': "\"\"", }, body: '$xmlReq'); var rawXmlResponse = response.body; // 处理转义后的XML字符串 String xmlContent = rawXmlResponse.replaceAll('<', '<').replaceAll('>', '>'); // 初始化结果结构,和你预期的格式对齐 Map<String, List<String>> parseResult = {}; xml.XmlDocument xmlDoc = xml.XmlDocument.parse(xmlContent); // 直接查找所有Field节点,无需逐层定位Record Iterable<xml.XmlElement> fieldNodes = xmlDoc.findAllElements("Field"); for (final field in fieldNodes) { // 读取标签上的name、value属性 String? nameAttr = field.getAttribute('name'); String? valueAttr = field.getAttribute('value'); if (nameAttr == null || valueAttr == null) continue; // 按属性name分组,收集value到对应列表 parseResult.putIfAbsent(nameAttr, () => []); parseResult[nameAttr]!.add(valueAttr); } // 直接取parseResult['plant']就能拿到所有工厂值的列表 print(parseResult); /* 针对你给出的XML示例,输出如下: { defaultplant: ["NBJF"], plant: ["CCJF", "CDJF"] } 后续接口返回更多plant字段时,会自动追加到plant对应的列表中 */ }
关键说明
- 不需要逐层遍历父节点,
findAllElements会递归扫描整个XML文档,匹配所有指定名称的节点,代码更简洁 - 所有标签尖括号内的属性,都可以通过节点对象的
getAttribute('属性名')方法直接读取,返回值为字符串,不存在对应属性时返回null - 如果只需要plant字段,在收集属性时加判断
if (nameAttr == 'plant')再存入列表即可,会过滤掉defaultplant这类其他字段
内容的提问来源于stack exchange,提问作者James Hu
相关产品推荐
相关产品推荐

