我想通过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
指定其他参数?
答案 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