2017-07-16 19 views
0

HereにあるSwift xmlパーサライブラリを使用しています。私は特定の値を持つ下のXMLから特定の値を取得するために探しています。XML応答スウィフトから値を取得

以下のXMLには、デバイスにインストールされているアプリのリストが表示され、各アプリの情報が一覧表示されます。のようなバージョンとアプリのサイズ。各<deviceSw>は、デバイス上の別のアプリです。私は com.fiberlink.browserアプリからバージョンの値を取得したいと考えています。注意すべき点は、一部のデバイスでcom.fiberlink.browserが3番目のアプリケーションまたは4番目のアプリケーションとしてリストされている可能性があるため、デバイスで2番目のアプリケーションを取得できないということです。 com.fiberlink.browserの値をXMLで並べ替え、その値を取得する方法はありますか?

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

EDIT 2:

for elem in xml["deviceSoftwares"]["deviceSw"]["swAttrs"].all 

    { 
     print(elem["key"].element!.text) 
    } 

と何も出力しない、そのちょうど空白の出力ウィンドウ:私は次のように私のコードを変更し

+0

更新質問。 –

+1

元の質問に追加 – Martheli

答えて

0

は、多くの闘争の後、以下のコードは動作します:これは、あなたがXMLに目を通すと、あなたが必要とするアプリ値の位置を取得することができます

   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 
         } 

         } 

        } 
       } 

。次に、より多くのコードを追加して位置をターゲットにして値を取得することができます。

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") 
関連する問題