обновление: , если вы знаете, что имя первого узла <foo>
, тогда вы можете просто сделать:
$ echo "<head>$(base -decode <file>)</head>" | \
xmlstarlet sel -t -m '//bar/ancestor::foo' -c .
Он выбирает предка с именем foo
узланазывается bar
, поскольку foo
является первым xml-узлом, он выберет запрошенный xml-файл.
оригинальный ответ ниже:
Использование xmlstarlet
Возможно, вы захотите сделать это
$ echo "<head>$(base -decode <file>)</head>" | \
xmlstarlet sel -t -m '//bar/ancestor::*[last()-1]' -c .
Это, по сути, выберет полное xml-дерево предков узла 'bar', но оно пойдет только на правильную глубину.
Я добавилдополнительный узел head
, чтобы сделать полную строку допустимым xml
файлом.Таким образом, вам нужно печатать только с первого узла и далее.
echo
будет производить что-то вроде (немного другая версия):
<head>
<foo />
<foo>
<barometer />
</foo>
<foo>
<DDD>
<BBB/>
<bar />
</DDD>
</foo>
</head>
xmlstarlet
сделает выбор шаблонана основе xpath //bar/ancestor::*
, что приводит к следующему набору совпадений
<bar />
<DDD><BBB /><bar /></DDD>
<foo><DDD><BBB /><bar /></DDD></foo>
<head> everything </ head>
Нас интересует предпоследний, то есть [last()-1]
, и мы просим распечатать его копию -c .