从 XML 响应 Swift 中获取价值
Get Value From XML Response Swift
我正在使用位于 Here 的 Swift xml 解析器库。我希望从下面的 XML 中获取具有特定值的特定值。
下面XML显示了设备上安装的应用程序列表,然后列出了每个应用程序的信息;比如版本和应用大小。每个 <deviceSw>
都是设备上的不同应用。我希望从
com.fiberlink.browser 应用程序。旁注是我不能只在设备上安装第二个应用程序,因为某些设备可能将 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>
编辑:
我已经尝试了下面的代码来遍历键,并且可能会在之后执行逻辑来排序但是它 returns 零值。
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)
}
什么也没有打印出来,它只是一个空白输出 window。
经过一番努力,下面的代码有效:
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 并获取您需要的应用值的位置。然后你可以添加更多代码来定位位置并获取值。
这种操作可以使用搜索谓词相当简洁地完成:
// 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: { [=10=]["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")
我正在使用位于 Here 的 Swift xml 解析器库。我希望从下面的 XML 中获取具有特定值的特定值。
下面XML显示了设备上安装的应用程序列表,然后列出了每个应用程序的信息;比如版本和应用大小。每个 <deviceSw>
都是设备上的不同应用。我希望从
com.fiberlink.browser 应用程序。旁注是我不能只在设备上安装第二个应用程序,因为某些设备可能将 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>
编辑:
我已经尝试了下面的代码来遍历键,并且可能会在之后执行逻辑来排序但是它 returns 零值。
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)
}
什么也没有打印出来,它只是一个空白输出 window。
经过一番努力,下面的代码有效:
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 并获取您需要的应用值的位置。然后你可以添加更多代码来定位位置并获取值。
这种操作可以使用搜索谓词相当简洁地完成:
// 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: { [=10=]["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")