Python:如何使用lxml来解析带句点的xml标记?

时间:2016-06-10 21:09:24

标签: python jenkins lxml

我正在尝试使用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'

2 个答案:

答案 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}}