在 plist 文件中如何通过 xmlstarlet 工具在唯一键标记后提取字符串文本

Posted

技术标签:

【中文标题】在 plist 文件中如何通过 xmlstarlet 工具在唯一键标记后提取字符串文本【英文标题】:In plist files how to extract string text after unique key tag via xmlstarlet tool 【发布时间】:2016-03-20 07:36:49 【问题描述】:

我想通过xmlstartlet 查询plist XML 文件。我正在寻找一个 string 标签的文本 after 一个独特的 key 标签。 XML 文件可能看起来像

<?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>BuildMachineOSBuild</key>
    <string>15B42</string>
    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>
    <key>CFBundleIconFile</key>
    <string>AppIcon</string>
    .
    .
    .
</dict>
</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">
<othertag>
    <dict>
        <key>BuildMachineOSBuild</key>
        <string>15B42</string>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
        <key>CFBundleIconFile</key>
        <string>AppIcon</string>
        .
        .
        .
    </dict>
</othertag>
</plist>

无论如何,我正在寻找字符串值的方式,例如密钥CFBundleDevelopmentRegion(在本例中为en)。

所以 dict 在层次结构中出现的位置是未知的(可以是 /plist/dict/plist/another/dict 或其他地方),但关键文本在整个文件中是唯一的。

我试过了

xmlstarlet sel -t -v '//string/following::key[text()="CFBundleDevelopmentRegion"]' myfile.plist

但我没有得到任何输出。是我的 XPath 错误还是必须为 xmlstarlet 指定其他参数?

【问题讨论】:

【参考方案1】:

你可以试试这个方法:

//key[.='CFBundleDevelopmentRegion']/following-sibling::string[1]

XPath 将在 XML 文档中任何内容等于 "CFBundleDevelopmentRegion" 的地方找到 key 元素,然后返回 最近 跟随兄弟 string 元素。

所以带有xmlstarlet 的完整命令行如下所示:

xmlstarlet sel --net -t -v '//key[.="CFBundleShortVersionString"]/following-sibling::string[1]' myfile.plist

【讨论】:

以上是关于在 plist 文件中如何通过 xmlstarlet 工具在唯一键标记后提取字符串文本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 skpsmtpmessage 正确附加 plist 文件?

如何在 plist 文件中为 UIColor 设置默认的 NSUserDefaults 值?

Plist:它是啥以及如何使用它

cocos2dx-深度解析plist文件(游戏对象的数据如何从plist创建获取)

Bash - 在 plist 文本文件中修改 WhitelistedBlockedPlugins

更改 plist 文件中的项目顺序