我正在尝试使用Python的lxml模块解析Jenkin的作业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
。当然没有名为哈德森的属性!如何使用像这样的愚蠢的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 :(得分:2)
使用lxml
的{{3}}模块的以下代码可以帮助我从<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 * * *'
。
答案 1 :(得分:2)
将triggers.hudson.triggers.TimerTrigger
解释为尝试访问以下结构中的<TimerTrigger>
元素是有意义的,因此它抱怨在给定OP实际时未找到hudson
子元素XML:
<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 * * *'
方法:
{{1}}