我可以将 iOS Info.plist 转换为 ruby 哈希吗?
Can I convert an iOS Info.plist into a ruby Hash?
我需要为我的应用程序排除在 Info.plist 中找到的特定键(如果它们在另一个哈希中找到)。目前我可以像这样访问 Info.plist 中的各个键
setting4Str = `/usr/libexec/PlistBuddy -c \"print :MySettingsDict:setting4" {settings_file}`
并且我可以在 plist 字典中的这个键处获取 "setting 4 text" 字符串集...
但是,我希望能够遍历此 MysettingsDict 的所有键。有没有人有办法将 iOS XML plist 转换为 ruby 字典?
<?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">
<dict>
<key>CFBundleDisplayName</key>
<string>My App</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>com.company.appname</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>de</string>
<string>it</string>
<string>fr</string>
<string>ru</string>
<string>es</string>
</array>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.3.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.company.mySchemeName</string>
<key>CFBundleURLSchemes</key>
<array>
<string>mySchemeName</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>1.3.15.04170</string>
<key>Internal version</key>
<string>1.3.15.04170</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>MysettingsDict</key>
<dict>
<key>setting1</key>
<false/>
<key>setting2</key>
<false/>
<key>setting3</key>
<false/>
<key>setting4</key>
<string>setting 4 text</string>
<key>setting5</key>
<string>setting 5 text</string>
<key>setting6</key>
<false/>
<key>setting7</key>
...
使用 Nokogiri Gem 解析 xml 然后将其输出为 ruby 散列。
这是另一个 Whosebug answer,如果文档不够用,它会给出一个示例。
想解析binary Info.plist.
的补充
info_plist = File.read("Info.plist") # read binary plist
IO.popen('plutil -convert xml1 -r -o - -- -', 'r+') {|f|
f.write(info_plist)
f.close_write
info_plist = f.read # xml plist
}
现在 info_plist 是一个 xml 字符串。要快速提取一个 属性,您可以使用正则表达式:
app_bundle = info_plist.scan(/<key>CFBundleIdentifier<\/key>\s+<string>(.+)<\/string>/).flatten.first
如果您正在寻找宝石,至少有 2 个选项:
plist
是用纯 Ruby 写的,而 plist_lite
是用 C 写的。
如果您关心性能,请使用 plist_lite
,它比 plist
快 5 倍以上。如果您需要一些丰富的功能,例如 encoding/decoding 非原始数据类型或格式,请使用 plist
.
plist_lite
的用法
require 'plist_lite'
plist = PlistLite.dump({foo: 'bar', ary: [1,2,3], time: Time.at(0)})
# => "<?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\"><dict><key>foo</key><string>bar</string><key>ary</key><array><integer>1</integer><integer>2</integer><integer>3</integer></array><key>time</key><date>1970-01-01T00:00:00Z</date></dict></plist>"
PlistLite.load(plist)
# => {"foo"=>"bar", "ary"=>[1, 2, 3], "time"=>1970-01-01 00:00:00 UTC}
plist
的用法
result = Plist.parse_xml('path/to/example.plist')
result.class
=> Hash
"#{result['FirstName']} #{result['LastName']}"
=> "John Public"
result['ZipPostal']
=> "12345"
我需要为我的应用程序排除在 Info.plist 中找到的特定键(如果它们在另一个哈希中找到)。目前我可以像这样访问 Info.plist 中的各个键
setting4Str = `/usr/libexec/PlistBuddy -c \"print :MySettingsDict:setting4" {settings_file}`
并且我可以在 plist 字典中的这个键处获取 "setting 4 text" 字符串集...
但是,我希望能够遍历此 MysettingsDict 的所有键。有没有人有办法将 iOS XML plist 转换为 ruby 字典?
<?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">
<dict>
<key>CFBundleDisplayName</key>
<string>My App</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>com.company.appname</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>de</string>
<string>it</string>
<string>fr</string>
<string>ru</string>
<string>es</string>
</array>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.3.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.company.mySchemeName</string>
<key>CFBundleURLSchemes</key>
<array>
<string>mySchemeName</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>1.3.15.04170</string>
<key>Internal version</key>
<string>1.3.15.04170</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>MysettingsDict</key>
<dict>
<key>setting1</key>
<false/>
<key>setting2</key>
<false/>
<key>setting3</key>
<false/>
<key>setting4</key>
<string>setting 4 text</string>
<key>setting5</key>
<string>setting 5 text</string>
<key>setting6</key>
<false/>
<key>setting7</key>
...
使用 Nokogiri Gem 解析 xml 然后将其输出为 ruby 散列。
这是另一个 Whosebug answer,如果文档不够用,它会给出一个示例。
想解析binary Info.plist.
的补充info_plist = File.read("Info.plist") # read binary plist
IO.popen('plutil -convert xml1 -r -o - -- -', 'r+') {|f|
f.write(info_plist)
f.close_write
info_plist = f.read # xml plist
}
现在 info_plist 是一个 xml 字符串。要快速提取一个 属性,您可以使用正则表达式:
app_bundle = info_plist.scan(/<key>CFBundleIdentifier<\/key>\s+<string>(.+)<\/string>/).flatten.first
如果您正在寻找宝石,至少有 2 个选项:
plist
是用纯 Ruby 写的,而 plist_lite
是用 C 写的。
如果您关心性能,请使用 plist_lite
,它比 plist
快 5 倍以上。如果您需要一些丰富的功能,例如 encoding/decoding 非原始数据类型或格式,请使用 plist
.
plist_lite
的用法
require 'plist_lite'
plist = PlistLite.dump({foo: 'bar', ary: [1,2,3], time: Time.at(0)})
# => "<?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\"><dict><key>foo</key><string>bar</string><key>ary</key><array><integer>1</integer><integer>2</integer><integer>3</integer></array><key>time</key><date>1970-01-01T00:00:00Z</date></dict></plist>"
PlistLite.load(plist)
# => {"foo"=>"bar", "ary"=>[1, 2, 3], "time"=>1970-01-01 00:00:00 UTC}
plist
的用法
result = Plist.parse_xml('path/to/example.plist')
result.class
=> Hash
"#{result['FirstName']} #{result['LastName']}"
=> "John Public"
result['ZipPostal']
=> "12345"