info.plist - xmlstarlet 不返回指定节点

Posted

技术标签:

【中文标题】info.plist - xmlstarlet 不返回指定节点【英文标题】:info.plist - xmlstarlet does not return specified node 【发布时间】:2018-01-22 16:52:35 【问题描述】:

我正在尝试使用 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

知道为什么它会返回该级别的所有“字符串”节点吗?

【问题讨论】:

【参考方案1】:

您正在匹配dict 并获取string 的值,因此它返回dict 中的所有字符串。

检查是否存在值为CFBundleVersionkey 元素除了仅选择dict(如果为真)之外没有任何作用。

尝试选择key 本身,然后获取第一个后续兄弟string 的值...

xmlstarlet sel --net -t -m "/plist/dict/key[.='CFBundleVersion']" -v "following-sibling::string[1]" ./Info.plist

这将返回:

321

【讨论】:

嗯...没有太多帮助。返回:Attempt to load network entity http://www.apple.com/DTDs/PropertyList-1.0.dtd @PaulM - 哦,是的,抱歉。那是因为您的 doctype 声明中的系统标识符指向一个 url。尝试在命令行中的sel 之后添加--net(请参阅更新的答案)。我没有这个问题,因为我在测试时没有复制 doctype 声明。我添加了doctype,重现了错误,然后通过添加--net验证了错误已解决。【参考方案2】:

或者对于上面的更快运行版本(因为我无法评论它),不要查找 DTD 并忽略 STDERR:

xmlstarlet sel -t -m "/plist/dict/key[text()='CFBundleVersion']" -v "following-sibling::string[1]" ./Info.plist 2>/dev/null

【讨论】:

以上是关于info.plist - xmlstarlet 不返回指定节点的主要内容,如果未能解决你的问题,请参考以下文章

无法读取 Info.plist,因为它的格式不正确

左列中不存在 Info.plist(但存在于 FINder 中)

Info.plist:由于格式不正确,无法读取数据

iOS 应用提交 - 存档不包含 info.plist

为啥 xmlstarlet 不选择所有节点?

为啥我的 info.plist 不是正常工作的 iphone info.plist