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