在 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 值?
cocos2dx-深度解析plist文件(游戏对象的数据如何从plist创建获取)