Как манипулировать XML из командной строки в сценарии оболочки?
Есть много команд для манипулирования табличными данными, замены переменных среды или замены текстовых фрагментов регулярным выражением, но я ничего не нашел для XML.
Мой сценарий сборки должен вставить тег с содержимым в основной тег документа xml, и я считаю излишним устанавливать для этого java, perl или python в ОС (мои сценарии выполняются в gitlab с образами docker, поэтому моя работа с инструментами, доступными в maven: изображение 3.5-jdk-8 было бы мечтой).
Я не хочу манипулировать XML с помощью sed, хотя в моем скрипте сборки это будет работать, потому что это зло .
Пример: у меня есть следующий XML:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- a lot of other tags-->
</project>
И я хочу вставить следующий блок:
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
внутри тега проекта (и не имеет значения, будет ли он в начале или в конце.
источник
maven
- я подозреваю, что есть лучший способ сделать то, что вы пытаетесь сделать в самом Maven.Ответы:
XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) написан на C и использует
libxml2
иlibxslt
.Учитывая документ XML
можно добавить подузел,
root
используякоторый производит
Вставка многих вещей (используя оригинал
file.xml
вверху):Это производит
Для примера в вопросе:
Результат:
Вставка предварительно подготовленного XML-файла в местоположение в XML:
Предполагая, что исходный XML из вопроса находится в,
file.xml
и дополнительные биты, которые должны идти в новомdistributinManagement
узле, находятсяnew.xml
(но не сам тег узла), можно сделать следующее для вставкиnew.xml
в корневой узел:XMLStarlet автоматически избежать данных , которая нуждается в убегающих, такие как
<
и>
символы.xml unesc
Бит декодирует введенные данные (это фактически декодирует весь документ, который может или не может быть проблемой) иxml fo
переформатирует полученный XML - документ.Результат
Мне немного неловко делать это так, «но это работает».
См. Также этот связанный вопрос на StackOverflow: /programming/29298507/xmlstarlet-xinclude-xslt
источник
Возможно, это все еще излишне, но если вас интересует только размер контейнера, вы можете использовать очень легкий язык, такой как Lua или Guile.
из документов Lua:
источник