从XML响应中获取价值Swift
问题描述:
我正在使用位于Here的Swift xml解析器库。我期望从具有一定价值的下面的XML中获得具体的价值。从XML响应中获取价值Swift
下面的XML显示了设备上安装的应用程序列表,然后列出了有关每个应用程序的信息;像版本和应用程序大小。每个<deviceSw>
是设备上的一个不同的应用程序。我期待从 com.fiberlink.browser应用程序获取版本值。值得注意的是,我不能仅仅获得设备上的第二个应用程序,因为有些设备可能会将com.fiberlink.browser列为第三个应用程序或第四个应用程序。有没有办法通过XML对com.fiberlink.browser的值进行排序,然后获取其版本值?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<deviceSoftwares>
<deviceSw>
<swAttrs>
<key>Application ID</key>
<type>string</type>
<value>com.fiberlink.maas360forios</value>
</swAttrs>
<swAttrs>
<key>Version</key>
<type>string</type>
<value>2.40.60</value>
</swAttrs>
<swAttrs>
<key>AppDataSize</key>
<type>string</type>
<value>2.09</value>
</swAttrs>
</deviceSw>
<deviceSw>
<swAttrs>
<key>Application ID</key>
<type>string</type>
<value>com.fiberlink.browser</value>
</swAttrs>
<swAttrs>
<key>Version</key>
<type>string</type>
<value>1.30.45</value>
</swAttrs>
<swAttrs>
<key>AppDataSize</key>
<type>string</type>
<value>0.51</value>
</swAttrs>
</deviceSw>
编辑:
我曾尝试下面的代码,通过密钥环,也许你的逻辑排序后通过但它返回零值。
for elem in xml["deviceSoftwares"]["deviceSw"].all {
print(elem["swAttrs"]["key"].element!.text!)
}
编辑2:
我改变了我的代码如下:
for elem in xml["deviceSoftwares"]["deviceSw"]["swAttrs"].all
{
print(elem["key"].element!.text)
}
并没有什么打印出来,它只是一个空白的输出窗口。
答
多斗争后,下面的代码工作:
var count: Int = 0
var stop = false
for elem in xml["deviceSoftwares"]["deviceSw"].all
{
for elem2 in elem["swAttrs"].all
{
if stop == false
{
count += 1
if (elem2["value"].element!.text) == "com.fiberlink.browser"
{
stop = true
}
}
}
}
这使您可以通过XML看起来并获得您需要的应用价值的位置。然后,您可以添加更多代码来定位并获取价值。
答
这种操作可以做得相当简洁使用搜索谓词:
// This assumes the attributes within each <deviceSw> tag are always ordered the same way
// (Application ID, Version, AppDataSize)
func getVersion(appId: String) -> String? {
let softwares = xml["deviceSoftwares"]["deviceSw"]
if let index = softwares.index(where: { $0["swAttrs"][0]["value"].element?.text == appId }) {
return softwares[index]["swAttrs"][1]["value"].element?.text
} else {
return nil
}
}
用法(假设xml: XMLIndexer
是在全球范围内):与代码
let version = getVersion(appId: "com.fiberlink.browser")
更新问题由你试过。 –
已添加到原始问题中 – Martheli