首页 > 解决方案 > 如何在颤动中显示来自 xml api 的数据?

问题描述

我想将组(groupID)的“名称”显示到listView中,我想显示的设备名称是表中的(demo,4v,demo2,doker ...)DeviceGroup,使用XML webservice。我使用xmljson进行转换它,请有人可以纠正我的错误。

我的 XML 网络服务:

<GTSResponse command="dbget" result="success">
    <Record table="DeviceGroup">
        <Field name="accountID" primaryKey="true">
            <![CDATA[demo]]>
        </Field>
        <Field name="groupID" primaryKey="true">
            <![CDATA[demo]]>
        </Field>
        <Field name="PushpinsLimitGroup">0</Field>
        <Field name="ReportsLimitGroup">0</Field>
        <Field name="displayName"></Field>
        <Field name="description">
            <![CDATA[4 v]]>
        </Field>
        <Field name="notes"></Field>
        <Field name="lastUpdateTime">1529258380</Field>
        <Field name="creationTime">1498727371</Field>
        <Field name="workOrderID"></Field>
        <Field name="allowNotify">false</Field>
        <Field name="notifyEmail"></Field>
        <Field name="parentGroupID"></Field>
    </Record>
    <Record table="DeviceGroup">
        <Field name="accountID" primaryKey="true">
            <![CDATA[demo]]>
        </Field>
        <Field name="groupID" primaryKey="true">
            <![CDATA[demo2]]>
        </Field>
        <Field name="PushpinsLimitGroup">0</Field>
        <Field name="ReportsLimitGroup">0</Field>
        <Field name="displayName"></Field>
        <Field name="description"></Field>
        <Field name="notes"></Field>
        <Field name="lastUpdateTime">1555499492</Field>
        <Field name="creationTime">1555499492</Field>
        <Field name="workOrderID"></Field>
        <Field name="allowNotify">false</Field>
        <Field name="notifyEmail"></Field>
        <Field name="parentGroupID"></Field>
    </Record>
    <Record table="DeviceGroup">
        <Field name="accountID" primaryKey="true">
            <![CDATA[demo]]>
        </Field>
        <Field name="groupID" primaryKey="true">
            <![CDATA[doker]]>
        </Field>
        <Field name="PushpinsLimitGroup">0</Field>
        <Field name="ReportsLimitGroup">0</Field>
        <Field name="displayName"></Field>
        <Field name="description"></Field>
        <Field name="notes"></Field>
        <Field name="lastUpdateTime">1528138728</Field>
        <Field name="creationTime">1528138728</Field>
        <Field name="workOrderID"></Field>
        <Field name="allowNotify">false</Field>
        <Field name="notifyEmail"></Field>
        <Field name="parentGroupID"></Field>
    </Record>
    <Record table="DeviceGroup">
        <Field name="accountID" primaryKey="true">
            <![CDATA[demo]]>
        </Field>
        <Field name="groupID" primaryKey="true">
            <![CDATA[glowex]]>
        </Field>
        <Field name="PushpinsLimitGroup">0</Field>
        <Field name="ReportsLimitGroup">0</Field>
        <Field name="displayName"></Field>
        <Field name="description"></Field>
        <Field name="notes"></Field>
        <Field name="lastUpdateTime">1604598739</Field>
        <Field name="creationTime">1604598739</Field>
        <Field name="workOrderID"></Field>
        <Field name="allowNotify">false</Field>
        <Field name="notifyEmail"></Field>
        <Field name="parentGroupID"></Field>
    </Record>
    <Record table="DeviceGroup">
        <Field name="accountID" primaryKey="true">
            <![CDATA[demo]]>
        </Field>
        <Field name="groupID" primaryKey="true">
            <![CDATA[inter]]>
        </Field>
        <Field name="PushpinsLimitGroup">0</Field>
        <Field name="ReportsLimitGroup">0</Field>
        <Field name="displayName"></Field>
        <Field name="description"></Field>
        <Field name="notes"></Field>
        <Field name="lastUpdateTime">1579869475</Field>
        <Field name="creationTime">1579869475</Field>
        <Field name="workOrderID"></Field>
        <Field name="allowNotify">false</Field>
        <Field name="notifyEmail"></Field>
        <Field name="parentGroupID"></Field>
    </Record>
    <Record table="DeviceGroup">
        <Field name="accountID" primaryKey="true">
            <![CDATA[demo]]>
        </Field>
        <Field name="groupID" primaryKey="true">
            <![CDATA[supporttest]]>
        </Field>
        <Field name="PushpinsLimitGroup">0</Field>
        <Field name="ReportsLimitGroup">0</Field>
        <Field name="displayName"></Field>
        <Field name="description"></Field>
        <Field name="notes"></Field>
        <Field name="lastUpdateTime">1599144965</Field>
        <Field name="creationTime">1599144965</Field>
        <Field name="workOrderID"></Field>
        <Field name="allowNotify">false</Field>
        <Field name="notifyEmail"></Field>
        <Field name="parentGroupID"></Field>
    </Record>
</GTSResponse>

从 Web 服务获取数据的函数

getDataGroupe() async {
    String message = "<GTSRequest command='dbget'><Authorization account='demo' user='xxxxxx' password='xxxxxxx'/><Record table='DeviceGroup' partial='true'><Field name='accountID'>demo</Field></Record></GTSRequest>";
    print("message: $message");

    String url = "http://xxxxxxxxxxxx";

    final http.Response response =
    await http.post(Uri.parse(url), body: message, headers: {
      'Content-type': 'text/xml',
    });

    Provider.of<APIProvider>(context, listen: false).setAccount(account);
    Provider.of<APIProvider>(context, listen: false).setUser(user);
    Provider.of<APIProvider>(context, listen: false).setPassword(password);

    if (response.statusCode == 200) {
      print(response.body);

      final Xml2Json xml2Json = Xml2Json();
      xml2Json.parse(response.body);
      var jsonString = xml2Json.toParker();
      print(jsonString);

      var  data= jsonDecode(jsonString);
       list = data['GTSResponse']['Record']['Field'];
      for(var item in list){
        print(item);
      }
    }
  }

列表显示

@override
  Widget build(BuildContext context) {
  
    return Scaffold(

      body:  new Expanded(
        child: ListView.builder(
          itemCount: list == null ? 0 : list.length,
          itemBuilder: (BuildContext context, int index) {
            return new ListTile(
              title: new Card(
                elevation: 5.0,
                child: new Container(
                  alignment: Alignment.centerLeft,
                  margin: new EdgeInsets.only(
                      top: 10.0, bottom: 10.0, left: 15),
                  child: new Text(
                     null  //data['GTSResponse']['Record'],
                  ),
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

控制台中的结果

deviceID我认为我使用的这个名称路径list = data['GTSResponse']['Record']['Field'];不正确 在此处输入图像描述

将 xml 数据转换为 json 后的结果,我想在“ Field”之后显示第二个元素(demo、demo2、doker、glowex、inter 和 suportest)

{"GTSResponse": {"Record": [{"Field": ["demo", "demo", {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]}, {"Field": ["demo", "demo2", {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]}, {"Field": ["demo", "doker", {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]}, {"Field": ["demo", "glowex", {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]}, {"Field": ["demo", "inter", {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]}, {"Field": ["demo", "supporttest", {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]}]}}

标签: xmlapiflutter

解决方案


错误是 data['GTSResponse']['Record'] 本身就是一个列表,您正在尝试提供一个字符串作为要访问的索引。

它应该像

data['GTSResponse']['Record'][0]['Field'][1];

访问第一条记录的第二个字段(索引 1),

data['GTSResponse']['Record'][1]['Field'][1];

第二条记录,依此类推。


试试这个:

var recordList = List.of(data['GTSResponse']['Record']); // Get the records
var requiredList = recordList.map<String>((record) => record['Field'][1]).toList(); // Generate the list of 2nd elements (index 1) of field of every record.

print(requiredList);

// Output: [demo, demo2, doker, glowex, inter, supporttest]

推荐阅读