2017-07-16 136 views
0

我正在使用位于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) 
    } 

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

+0

更新问题由你试过。 –

+1

已添加到原始问题中 – Martheli

回答

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看起来并获得您需要的应​​用价值的位置。然后,您可以添加更多代码来定位并获取价值。

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