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



我想通过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)。

因此,字典在层次结构中出现的位置是未知的(可以是/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 文档中的任意位置查找内容等于 "CFBundleDevelopmentRegion"key元素,然后返回最接近的后续同级元素string

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

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

相关内容

  • 没有找到相关文章

最新更新