从XML响应Swift获取值

xdyibdwo  于 2023-04-28  发布在  Swift
关注(0)|答案(2)|浏览(137)

我使用的是一个Swift xml解析器库,位于Here。我希望从下面的XML中获得一个特定的值,具有一定的价值。
下面的XML显示了设备上安装的应用程序列表,然后列出了每个应用程序的信息;例如版本和应用大小。每个<deviceSw>是设备上的不同应用程序。我期待得到的版本值从com.fiberlink浏览器应用程序边注是,我不能只在设备上获得第二个应用程序,因为有些设备可能有com。浏览器被列为第三个应用程序或第四个应用程序。有没有一种方法可以在XML中对com的值进行排序。然后获取它的Version值?

<?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)
}

什么也不打印出来,它只是一个空白的输出窗口。

s2j5cfk0

s2j5cfk01#

这种操作可以使用搜索 predicate 相当简洁地完成:

// 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")
iecba09b

iecba09b2#

经过一番努力,下面的代码工作了:

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并获得所需的app值的位置。然后,您可以添加更多代码来定位位置并获取值。

相关问题