Cocoa NSTask 输出提取
Cocoa NSTask ouput extraction
我想在我的 Cocoa 应用程序中 运行 此命令 system_profiler -xml SPUSBDataType
。在 NSTask
的帮助下完成后,我通过将 fileHandle
输出编码为 NSString
得到以下输出。但我无法提取特定键的值。我尝试使用 SWXMLHash
将其转换为 xml,并使用 jsonSerializer
将其转换为 JSON。但它变得更加复杂。
有什么办法吗?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>_SPCommandLineArguments</key>
<array>
<string>/usr/sbin/system_profiler</string>
<string>-nospawn</string>
<string>-xml</string>
<string>SPCameraDataType</string>
<string>-detailLevel</string>
<string>full</string>
</array>
<key>_SPCompletionInterval</key>
<real>0.13360595703125</real>
<key>_SPResponseTime</key>
<real>0.22787702083587646</real>
<key>_dataType</key>
<string>SPCameraDataType</string>
<key>_detailLevel</key>
<integer>-1</integer>
<key>_items</key>
<array>
<dict>
<key>_name</key>
<string>FaceTime HD Camera</string>
<key>spcamera_model-id</key>
<string>Apple Camera VendorID_0x106B ProductID_0x1570</string>
<key>spcamera_unique-id</key>
<string>CC89657KQR6GDV4AQ</string>
</dict>
</array>
</dict>
</array>
</plist>
您应该能够使用 PropertyListSerialization
直接解析此输出。查看 documentation.
我建议您可以改用 IOKit 看看。掌握它可能有点令人生畏 API,但它提供了巨大的力量。我过去曾将它用于 USB 设备信息和 connect/disconnect 通知,效果非常好。我认为您会发现它比解析命令行实用程序的输出更强大。
您可以使用类似下面的方法来获取包含字典的数组。
let url = Bundle.main.url(forResource: "data", withExtension: "plist")!
let plistData = try! Data(contentsOf: url)
if let array = try! PropertyListSerialization.propertyList(from: plistData, options: [], format: nil) as? [[String:Any]] {
print(array)
}
我想在我的 Cocoa 应用程序中 运行 此命令 system_profiler -xml SPUSBDataType
。在 NSTask
的帮助下完成后,我通过将 fileHandle
输出编码为 NSString
得到以下输出。但我无法提取特定键的值。我尝试使用 SWXMLHash
将其转换为 xml,并使用 jsonSerializer
将其转换为 JSON。但它变得更加复杂。
有什么办法吗?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>_SPCommandLineArguments</key>
<array>
<string>/usr/sbin/system_profiler</string>
<string>-nospawn</string>
<string>-xml</string>
<string>SPCameraDataType</string>
<string>-detailLevel</string>
<string>full</string>
</array>
<key>_SPCompletionInterval</key>
<real>0.13360595703125</real>
<key>_SPResponseTime</key>
<real>0.22787702083587646</real>
<key>_dataType</key>
<string>SPCameraDataType</string>
<key>_detailLevel</key>
<integer>-1</integer>
<key>_items</key>
<array>
<dict>
<key>_name</key>
<string>FaceTime HD Camera</string>
<key>spcamera_model-id</key>
<string>Apple Camera VendorID_0x106B ProductID_0x1570</string>
<key>spcamera_unique-id</key>
<string>CC89657KQR6GDV4AQ</string>
</dict>
</array>
</dict>
</array>
</plist>
您应该能够使用 PropertyListSerialization
直接解析此输出。查看 documentation.
我建议您可以改用 IOKit 看看。掌握它可能有点令人生畏 API,但它提供了巨大的力量。我过去曾将它用于 USB 设备信息和 connect/disconnect 通知,效果非常好。我认为您会发现它比解析命令行实用程序的输出更强大。
您可以使用类似下面的方法来获取包含字典的数组。
let url = Bundle.main.url(forResource: "data", withExtension: "plist")!
let plistData = try! Data(contentsOf: url)
if let array = try! PropertyListSerialization.propertyList(from: plistData, options: [], format: nil) as? [[String:Any]] {
print(array)
}