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

时间:2016-03-20 07:36:50

标签: xml xpath plist xmlstarlet

我想通过xmlstartlet查询plist XML文件。我在一个唯一的string标记之后直接找到<{1}}标记的文字。 XML文件看起来像

key

<?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)。

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

我试过了

/plist/another/dict

但我没有得到任何输出。我的XPath是错误的还是我必须为xmlstarlet sel -t -v '//string/following::key[text()="CFBundleDevelopmentRegion"]' myfile.plist 指定其他参数?

1 个答案:

答案 0 :(得分:2)

您可以尝试这种方式:

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

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

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

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