从XML Response Swift获取价值

时间:2017-07-16 00:26:33

标签: xml swift swxmlhash

我正在使用位于Here的Swift xml解析器库。我希望从下面的XML中获取具有特定值的特定值。

以下XML显示设备上安装的应用列表,然后列出有关每个应用的信息;喜欢版本和应用程序大小。每个<deviceSw>都是设备上的其他应用。我希望从中获取版本值 com.fiberlink.browser app。旁注是我无法在设备上获得第二个应用程序,因为某些设备可能将com.fiberlink.browser列为第三个应用程序或第四个应用程序。有没有办法通过XML对com.fiberlink.browser的值进行排序,然后获取它的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>

修改

我已经尝试了下面的代码来遍历键,并且可能会执行逻辑排序,但它会返回nil值。

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

并且没有打印出来,它只是一个空白的输出窗口。

2 个答案:

答案 0 :(得分:0)

经过多次努力,以下代码有效:

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

答案 1 :(得分:0)

使用搜索谓词可以非常简洁地完成这种操作:

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