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'
答
这有一定道理是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 * * *'
答
使用lxml
的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 * * *'
。
只是一个猜测,但你可能需要使用'etree'代替。 – MattDMo
这太糟糕了,因为我真的很喜欢清洁客观化的东西。我注意到我可以做'root.triggers.getchildren()[0] .spec = period',但这看起来像一个黑客。 –
如果有效,请使用它。我发现使用XPath与客观化一样简单明了,它可以处理包含句点和冒号的复杂标记,但对每个标记都有效。 – MattDMo