В файлах plist, как извлечь строковый текст после уникального ключевого тега с помощью инструмента xmlstarlet

Я хочу запрашивать XML-файлы plist через xmlstartlet. Я ищу текст тега 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>

or

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


person halloleo    schedule 20.03.2016    source источник


Ответы (1)


Вы можете попробовать так:

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

XPath найдет элемент key в любом месте XML-документа, где содержимое равно "CFBundleDevelopmentRegion", а затем вернет ближайший элемент string следующего брата.

Итак, полная командная строка с xmlstarlet выглядит так:

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