2016-06-10 1 views
2

Я пытаюсь разобрать Jenkin's рабочие файлы XML, используя модуль lxml для Python. Это выглядит следующим образом:Python: Как вы используете lxml для разбора тэгов xml с периодами?

<triggers> 
    <hudson.triggers.TimerTrigger> 
     <spec>H H(6-21)/3 * * *</spec> 
</hudson.triggers.TimerTrigger> 

Мне нравится использовать удобный объективизации модуль LXML, но он запутывается, когда я пытаюсь сделать это:

root.triggers.hudson.triggers.TimerTrigger.spec = 'something' 

я получаю AttributeError: no such child: hudson. Конечно, нет атрибута hudson! Как работать с дурацкой частью XML?

Для дополнительного контекста, вот мой код:

from lxml import objectify 
import jenkins 

j = jenkins.Jenkins('http://local.jenkins.instance') 
xml = j.get_job_config('job_name') 
root = objectify.fromstring(xml) 
root.triggers.hudson.triggers.TimerTrigger.spec = 'something' 
+0

только предположение, но, возможно, придется использовать 'etree' вместо этого. – MattDMo

+0

Это слишком плохо, поскольку мне очень нравится, как чистое объективирование делает вещи. Я заметил, что могу сделать «root.triggers.getchildren() [0] .spec = period', но это казалось взломом. –

+0

Если это работает, используйте его. Я считаю использование XPath столь же простым, как объективирование, и оно работает со сложными тегами, содержащими периоды и двоеточия, но для каждого из них. – MattDMo

ответ

2

Это имеет смысл, что triggers.hudson.triggers.TimerTrigger истолковано как попытку получить доступ <TimerTrigger> элемента в следующей структуре, поэтому он жаловался hudson дочерний элемент не найден, когда данные фактический XML OP в:

<triggers> 
    <hudson> 
    <triggers> 
     <TimerTrigger> 
     <spec>H H(6-21)/3 * * *</spec> 
     </TimerTrigger> 
    </triggers> 
    </hudson> 
</triggers> 

Один из возможных способов Асесса ребенка элемент, где имя содержит точки без необходимости переключения etree будет использовать __getattr__() метод:

>>> root.triggers.__getattr__('hudson.triggers.TimerTrigger').spec 
'H H(6-21)/3 * * *' 
2

Следующий код с помощью lxml «s etree модуль работал для меня, чтобы получить текст из <spec>:

from lxml import etree 

root = etree.parse("37757193.xml").getroot() 
spec = root.xpath("//triggers/hudson.triggers.TimerTrigger/spec")[0] 
print(spec.text) 

'H H(6-21)/3 * * *' возвращается.

 Смежные вопросы

  • Нет связанных вопросов^_^