2017-07-16 163 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")