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

问题描述:

我试图使用Python中LXML模块来解析詹的工作的XML文件。它看起来像这样: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。当然,没有任何属性命名为哈德森!如何使用这种愚蠢的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

这有一定道理是triggers.hudson.triggers.TimerTrigger解读为试图在下面的结构来访问<TimerTrigger>元素,因此它抱怨给OP的实际XML时,未发现有关hudson子元素:

<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 * * *' 

使用lxmletree模块下面的代码工作对我来说,从<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 * * *'