2015-07-29 4 views
2

Моего XML:XMLStarlet - удалить XML элемент - сценарии оболочки

<?xml version='1.0' encoding='UTF-8'?> 
<mm2-moduleset plugin="[email protected]"> 
.. 
    <buildType class="hudson.mm.MMModuleSet$Component"> 
     <viewableName>Component</viewableName> 
    </buildType> 
    <selectedCodeComponents> 
     <string>admin-content</string> 
     <string>admin</string> 
    </selectedCodeComponents> 
    <incrementalBuild>false</incrementalBuild> 
    ... 
    ... 
</mm2-moduleset> 
</xml> 

В принципе, им пытается получить сведение о задании из Дженкинс-консоли плагина, и обновить конфигурацию файла XML (конфигурацию задание jenkins), а затем обновить задание jenkins, используя shell-script.

Для этого мне нужно заменить значения атрибутов «string» атрибута «selectedCodeComponents» в соответствии с пользовательским вводом с использованием сценария оболочки. если вход чек, чек-контент, банк, затем

<selectedCodeComponents> 
     <string>check-content</string> 
     <string>check</string> 
     <string>bank</string>  
    </selectedCodeComponents> 

Мой код:

${JAVA_HOME}/bin/java -Djavax.net.ssl.trustStore=${JENKINS_HOST}.keystore -Djavax.net.ssl.trustStorePassword=112012 -jar ./jenkins-cli.jar -s https://$USERNAME:$API_TOKEN\@$JENKINS_HOST:$JENKINS_PORT\/jenkins get-job job_1 > job1.xml 

(Jenkins-кли - Get-Job возвращает конфигурации в XML-файле)

Я думал первого удаления элементов строки в выбранных компонентах и ​​добавления с тем, что дает пользователь. Подобно этому,

xmlstarlet ed -d "mm2-moduleset/selectedCodeComponents/string" abc.xml 

// some logic 
xmlstarlet ed -a "mm2-moduleset/selectedCodeComponents/string" --type elem -n string -v "something" abc.xml 

Но после выполнения первой команды (XMLStarlet ред -d), она удаляет seletedcodecomponents, а также. Но я хотел удалить в нем только строковые элементы.

<?xml version='1.0' encoding='UTF-8'?> 
<mm2-moduleset plugin="[email protected]"> 
.. 
    <buildType class="hudson.mm.MMModuleSet$Component"> 
     <viewableName>Component</viewableName> 
    </buildType> 
    </selectedCodeComponents> 
    <incrementalBuild>false</incrementalBuild> 
    ... 
    ... 
</mm2-moduleset> 
</xml>, 

команду Append также добавление в два раза. (XMLStarlet ред -a) Для еи

xmlstarlet ed -a "mm2-moduleset/selectedCodeComponents/string" --type elem -n string -v "check" abc.xml 


<?xml version='1.0' encoding='UTF-8'?> 
<mm2-moduleset plugin="[email protected]"> 
.. 
    <buildType class="hudson.mm.MMModuleSet$Component"> 
     <viewableName>Component</viewableName> 
    </buildType> 
    <selectedCodeComponents> 
     <string>admin-content</string> 
     <string>check</string> 
     <string>admin</string> 
     <string>check</string> 

    </selectedCodeComponents> 
    <incrementalBuild>false</incrementalBuild> 
    ... 
    ... 
</mm2-moduleset> 
</xml> 

могли бы вы сказать мне, как удалить только строковые элементы внутри selectedcodecomponents элемента и поэтому добавление команда добавляет в два раза

Я новичок в сценарий оболочки, следовательно, ваши предложения помогли бы мне

ответ

2

Закрепление ваш пример XML файл немного, чтобы дать ему корневой тег:

$ cat file.xml 
<?xml version='1.0' encoding='UTF-8'?> 
<root> 
    <buildType class="hudson.mm.MMModuleSet$Component"> 
     <viewableName>Component</viewableName> 
    </buildType> 
    <selectedCodeComponents> 
     <string>admin-content</string> 
     <string>admin</string> 
    </selectedCodeComponents> 
    <incrementalBuild>false</incrementalBuild> 
</root> 

вы удалите string узлы, как этот

$ xmlstarlet ed -d '//selectedCodeComponents/string' file.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <buildType class="hudson.mm.MMModuleSet$Component"> 
    <viewableName>Component</viewableName> 
    </buildType> 
    <selectedCodeComponents/> 
    <incrementalBuild>false</incrementalBuild> 
</root> 

А затем добавить новые строки подузлы как этот

$ xmlstarlet ed -d '//selectedCodeComponents/string' file.xml | 
xmlstarlet ed -s '//selectedCodeComponents' -t elem -n string -v something1 | 
xmlstarlet ed -s '//selectedCodeComponents' -t elem -n string -v something2 | 
xmlstarlet ed -s '//selectedCodeComponents' -t elem -n string -v something3 
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <buildType class="hudson.mm.MMModuleSet$Component"> 
    <viewableName>Component</viewableName> 
    </buildType> 
    <selectedCodeComponents> 
    <string>something1</string> 
    <string>something2</string> 
    <string>something3</string> 
    </selectedCodeComponents> 
    <incrementalBuild>false</incrementalBuild> 
</root> 
+0

Привет, Джекман, спасибо за ваш вклад. но могу ли я знать, почему вы добавляете корневой тег? –

+0

Вы не указали xml-файл в команде xmlstarlet subnode? в чем разница между моим кодом и этим кодом? и я не уверен, как результат будет отличаться.возможно, пожалуйста, объясните, –

+1

'' не является элементом, это объявление, поэтому закрытие '' недействительно - тест с 'xmlstarlet validate file.xml' –

0

1), если вам нужно удалить целые строковые элементы, используйте ниже код

xmlstarlet ed -P -S -d "/mm2-moduleset/.../selectedCodeComponents/string" config.xml >temp.xml 
mv temp.xml config.xml 

2), если нужно удалить определенную строку элемента, используйте ниже код

read -p "read the string that need to be deleted" deleteString 

xmlstarlet ed -P -S -d "/mm2-moduleset/.../selectedCodeComponents/string[text()='$deleteString']" config.xml >temp.xml 
mv temp.xml config.xml 

3) если вы должны заменить строки на основе пользовательского ввода, вы можете попробовать следующий код

read - "read the string that need to be modify" modifyString1 modifyString2 modifyString3 

xmlstarlet ed -P -S -s "/mm2-moduleset/.../selectedCodeComponents" -t elem -n string -v $modifyString1 -s "/mm2-moduleset/.../selectedCodeComponents" -t elem -n string -v $modifyString2 -s "/mm2-moduleset/.../selectedCodeComponents" -t elem -n string -v $modifyString3 config.xml >temp.xml 
mv temp.xml config.xml