info.plist - xmlstarlet 没有 return 指定的节点
info.plist - xmlstarlet does not return specified node
我正在尝试使用 xmlstartlet 解析 info.plist(对于 iOS 应用程序)。我在 MacBook Pro 上 OSX 中执行此操作。这是我的 info.plist:
<?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>UIRequiresFullScreen</key>
<true/>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>MinimumOSVersion</key>
<string>9.3</string>
<key>CFBundleDisplayName</key>
<string>My iOS App</string>
<key>CFBundleIdentifier</key>
<string>local.nowhere.MyiOSApp</string>
<key>CFBundleShortVersionString</key>
<string>3.3.0</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UISupportedExternalAccessoryProtocols</key>
<key>UIBackgroundModes</key>
<array>
<string>external-accessory</string>
</array>
<key>UIAppFonts</key>
<array>
<string>FontAwesome.ttf</string>
</array>
<key>CFBundleVersion</key>
<string>321</string>
<key>NSLocationWhenInUseUsageDescription</key>
<array>
<string>Location enabled?</string>
</array>
<key>NSCameraUsageDescription</key>
<string>needs access to the camera</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>needs access to photos</string>
<key>NSCalendarsUsageDescription</key>
<string>needs access to the calendar</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>needs access to bluetooth</string>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>XSAppIconAssets</key>
<string>Resources/Media.xcassets/AppIcons.appiconset</string>
<key>XSLaunchImageAssets</key>
<string>Resources/Media.xcassets/LaunchImages.launchimage</string>
</dict>
</plist>
这是我的 xmlstarlet 命令:
xmlstarlet sel -t -m "/plist/dict[key='CFBundleVersion']" -v string ./Info.plist
这是输出:
Attempt to load network entity http://www.apple.com/DTDs/PropertyList-1.0.dtd
9.3
My iOS App
local.nowhere.MyiOSApp
3.3.0
321
needs access to the camera
needs access to photos
needs access to the calendar
needs access to bluetooth
UIStatusBarStyleLightContent
Resources/Media.xcassets/AppIcons.appiconset
Resources/Media.xcassets/LaunchImages.launchimage
知道为什么它会返回该级别的所有 'string' 节点吗?
您正在匹配 dict
并获取 string
的值,因此它 return 正在 dict
中的所有字符串。
检查是否存在值为 CFBundleVersion
的 key
元素除了 select 和 dict
之外没有任何其他作用(如果为真)。
尝试 selecting key
本身,然后获取第一个后续同级 string
...
的值
xmlstarlet sel --net -t -m "/plist/dict/key[.='CFBundleVersion']" -v "following-sibling::string[1]" ./Info.plist
这将 return:
321
或者对于上面的更快的 运行 版本(因为我无法对其发表评论),不要查找 DTD 并忽略 STDERR:
xmlstarlet sel -t -m "/plist/dict/key[text()='CFBundleVersion']" -v "following-sibling::string[1]" ./Info.plist 2>/dev/null
我正在尝试使用 xmlstartlet 解析 info.plist(对于 iOS 应用程序)。我在 MacBook Pro 上 OSX 中执行此操作。这是我的 info.plist:
<?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>UIRequiresFullScreen</key>
<true/>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>MinimumOSVersion</key>
<string>9.3</string>
<key>CFBundleDisplayName</key>
<string>My iOS App</string>
<key>CFBundleIdentifier</key>
<string>local.nowhere.MyiOSApp</string>
<key>CFBundleShortVersionString</key>
<string>3.3.0</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UISupportedExternalAccessoryProtocols</key>
<key>UIBackgroundModes</key>
<array>
<string>external-accessory</string>
</array>
<key>UIAppFonts</key>
<array>
<string>FontAwesome.ttf</string>
</array>
<key>CFBundleVersion</key>
<string>321</string>
<key>NSLocationWhenInUseUsageDescription</key>
<array>
<string>Location enabled?</string>
</array>
<key>NSCameraUsageDescription</key>
<string>needs access to the camera</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>needs access to photos</string>
<key>NSCalendarsUsageDescription</key>
<string>needs access to the calendar</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>needs access to bluetooth</string>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>XSAppIconAssets</key>
<string>Resources/Media.xcassets/AppIcons.appiconset</string>
<key>XSLaunchImageAssets</key>
<string>Resources/Media.xcassets/LaunchImages.launchimage</string>
</dict>
</plist>
这是我的 xmlstarlet 命令:
xmlstarlet sel -t -m "/plist/dict[key='CFBundleVersion']" -v string ./Info.plist
这是输出:
Attempt to load network entity http://www.apple.com/DTDs/PropertyList-1.0.dtd
9.3
My iOS App
local.nowhere.MyiOSApp
3.3.0
321
needs access to the camera
needs access to photos
needs access to the calendar
needs access to bluetooth
UIStatusBarStyleLightContent
Resources/Media.xcassets/AppIcons.appiconset
Resources/Media.xcassets/LaunchImages.launchimage
知道为什么它会返回该级别的所有 'string' 节点吗?
您正在匹配 dict
并获取 string
的值,因此它 return 正在 dict
中的所有字符串。
检查是否存在值为 CFBundleVersion
的 key
元素除了 select 和 dict
之外没有任何其他作用(如果为真)。
尝试 selecting key
本身,然后获取第一个后续同级 string
...
xmlstarlet sel --net -t -m "/plist/dict/key[.='CFBundleVersion']" -v "following-sibling::string[1]" ./Info.plist
这将 return:
321
或者对于上面的更快的 运行 版本(因为我无法对其发表评论),不要查找 DTD 并忽略 STDERR:
xmlstarlet sel -t -m "/plist/dict/key[text()='CFBundleVersion']" -v "following-sibling::string[1]" ./Info.plist 2>/dev/null