#python #xml #jenkins
#python #xml #дженкинс
Вопрос:
У меня есть XML-файл (по сути, файл является подчиненным jenkins config.xml файл), откуда я должен получить определенные значения. Итак, я попытался проанализировать xml
файл, используя Element Tree
что-то вроде этого
tree = ET.parse(config.xml)
root = tree.getroot()
print root
for item in root.findall('slave'):
и затем я сохраняю этот проанализированный xml
файл в текстовый файл, теперь я хочу получить значение внутри этого тега
Я могу сделать это через bash
, но я хочу знать, как мы можем сделать это на python
Далее следует код bash
cat test.xml | sed -n 's:.*<label>(.*)</label>.*:1:p'
Вот пример подчиненного устройства jenkins config.xml файл
<slave>
<name>some_name</name>
<description/>
<remoteFS>some_value</remoteFS>
<numExecutors>xx</numExecutors>
<mode>EXCLUSIVE</mode>
<retentionStrategy class="xxxx"/>
<launcher class="xxxxx" plugin="xxxxx">
<host>xxx.x.x.xx</host>
<port>xx</port>
<credentialsId>xxxxxxx-xxx-xxxx-xxxx-xxxxxxxxxxxx</credentialsId>
<maxNumRetries>0</maxNumRetries>
<retryWaitTime>0</retryWaitTime>
<sshHostKeyVerificationStrategy class="hudson.plugins.sshslaves.verifiers.NonVerifyingKeyVerificationStrategy/></launcher>
<label>some_label</label>
</slave>
Аналогично label мне нужны и другие значения, такие как имя хоста, порт и т.д.
Комментарии:
1. Приведенный пример
config.xml
не является допустимым XML-файлом. Получаю ошибку в<sshHostKeyVerificationStrategy xxxxxxxxx/>
. Ошибка:Attribute name "xxxxxxxxx" associated with an element type "sshHostKeyVerificationStrategy" must be followed by the ' = ' character.
. Прикрепите действительный XML-файл.2. отредактировано в правильном формате
Ответ №1:
Вы можете выполнять рекурсивную итерацию, используя .iter()
для поиска элементов. Проверьте официальную документацию.
Вот пример печати label
и host
текста из slave
узла.
Обновление: code.py
Изменен, чтобы дополнительно печатать class
значение атрибута launcher
тега. Он использует element.attrib
для получения атрибутов тега. Больше можно найти в официальной документации по синтаксическому анализу XML.
test.xml
:
<slave>
<name>some_name</name>
<description/>
<remoteFS>some_value</remoteFS>
<numExecutors>xx</numExecutors>
<mode>xxx</mode>
<retentionStrategy class="xxxx"/>
<launcher class="xxxxx" plugin="xxxxx">
<host>xxx.x.x.xx</host>
<port>xx</port>
<credentialsId>xxxxxxxx</credentialsId>
<maxNumRetries>x</maxNumRetries>
<retryWaitTime>x</retryWaitTime>
<sshHostKeyVerificationStrategy class="hudson.plugins.sshslaves.verifiers.NonVerifyingKeyVerificationStrategy"/>
</launcher>
<label>somelabel</label>
</slave>
code.py
:
import xml.etree.ElementTree as ET
tree = ET.parse("test.xml")
root = tree.getroot()
for item in root.iter('slave'):
for label in item.iter("label"):
print label.text
for host in item.iter("host"):
print host.text
for launcher in item.iter("launcher"):
print launcher.attrib["class"]
Вывод:
somelabel
xxx.x.x.xx
xxxxx
Комментарии:
1. как я могу получить класс launcher отсюда?? для запуска в item.iter («launcher»): похоже, не работает
2. Обновлен ответ, чтобы показать атрибут класса
launcher
тега.