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

In plist files how to extract string text after unique key tag via xmlstarlet tool

我想通过 xmlstartlet 查询 plist XML 文件。我正在寻找 string 标签的文本 一个独特的 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?

指定其他参数

你可以这样试试:

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

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

因此 xmlstarlet 的完整命令行如下所示:

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