xml - 如何在颤动中显示来自 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", {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]}]}}
解决方案
错误是 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]
推荐阅读
- vba - MS Project 宏用于发送具有固定收件人、主题和正文的当前 .mpp
- swift - 如何将文本移动到集合中的下一个项目?
- asp.net-core - Asp.Net Core 3x Swagger 用于身份验证的多个标头
- python - 使用 Matplotlib 从 GUI 中的单独线程保存图形
- azure - 我已将用户 ID 和密码存储在 azure key vault 中,我需要在 kubernetes 的 init 容器中检索这些秘密
- xaml - 将数据传递到另一个页面会导致值更改为 null
- javascript - 我可以在 React 应用程序的哪个级别处理来自未正确解码的 URI 组件的错误?
- java - 将相同的 XML 标记解析为不同的 java 对象
- powershell - 如何使用 cmd 运行 Powershell 脚本
- office-js - 是否有可能在 Excel 触发计算之前运行代码?