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