К сожалению, XMLStarlet очень требователен к пространству имен по умолчанию.Если в документе объявлено (xmlns=
), вы должны объявить его и для XMLStarlet и добавить к элементам имя, которое вы выбрали (см. здесь ):
xml sel -N my = http://maven.apache.org/POM/4.0.0 -t -m my: проект -v my: groupId -o: -v my: artifactId -o: -v my: версия pom.xml
Выполнение вышеуказанной команды дает ожидаемый результат:
org.something.apps:app-acct:5.4
Однако, если документ НЕ имеет объявленного пространства имен по умолчанию (или пространство имен имеет немного другой URL), вышеуказанная команда НЕ будет работать, которая является настоящей PITA.Более универсальным решением является удаление объявления пространства имен по умолчанию перед выбором элементов.Начиная с XMLStarlet 1.3.1, преобразование XML в формат PYX и обратно удаляет объявления пространства имен:
xml pyx pom.xml |xml p2x |xml sel -t -m project -v groupId -o: -v artifactId -o: -v версия 2> nul
ОБНОВЛЕНИЕ (2014-02-12): asXMLStarlet 1.4.2 XML-преобразование PYX <-> исправлено (не удаляет объявления пространства имен), поэтому приведенная выше команда НЕ будет работать (спасибо за подсказку Питеру Глуку).Вместо этого используйте следующую команду:
xml pyx pom.xml |grep -v ^ A |xml p2x |xml sel -t -m project -v groupId -o: -v artifactId -o: -v версия
Примечание. Приведенный выше grep удаляет ВСЕ атрибуты из документа, а не только объявления пространства имен.Для этого конкретного случая (выбор значений элементов из pom.xml, где элементы с пространствами имен не по умолчанию не ожидаются) это нормально, но для общего XML вы удалили бы только объявление (я) пространства имен по умолчанию и ничего больше:
xml pyx pom.xml |grep -v "^ Axmlns" |xml p2x |xml sel -t -m project -v groupId -o: -v artifactId -o: -v версия
Примечание (устарело): перенаправление ошибок (2>nul
) необходимо дляскрыть жалобу на (теперь) неизвестное пространство имен xsi:
-: 1.28: Префикс пространства имен xsi для schemaLocation в проекте не определен
Другой способ избавиться отжалоба состоит в том, чтобы удалить атрибут schemaLocation (фактически эта команда удаляет все атрибуты из документа PYX, а не только xsi: schemaLocation):
xml pyx pom.xml |grep -v ^ A |xml p2x |xml sel -t -m project -v groupId -o: -v artifactId -o: -v версия