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