You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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('&lt;', '<').replaceAll('&gt;', '>');

  // 初始化结果结构,和你预期的格式对齐
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:39:34