Как я могу проанализировать XML-файл на python

#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 тега.