如何在LXML XPath Expression中使用变量

时间:2013-07-12 10:43:02

标签: python xpath python-3.x lxml

我在eclipse中使用Python 3.3和Windows 7上的PyDev插件。

我需要使用XPath和LXML解析XML文件。如果我使用静态XPath表达式它可以工作,但我需要使用变量,但是当我在表达式中使用变量时它不起作用。

如果我使用此代码:

xml = etree.parse(fullpath).getroot()
tree = etree.ElementTree(xml)

nsmap = {'xis' : 'http://www.xchanging.com/ACORD4ALLEDI/1',
         'ns' : 'http://www.ACORD.org/standards/Jv-Ins-Reinsurance/1' }

p = tree.xpath('//xis:Line', namespaces=nsmap)
print (p)
for e in p:
    print(e.tag, e.text)

它按我的意愿工作,print(p)返回

 [<Element {http://www.xchanging.com/ACORD4ALLEDI/1}LloydsProcessingCode at 0x2730350>]

但如果我将其更改为:

xml = etree.parse(fullpath).getroot()
tree = etree.ElementTree(xml)

nsmap = {'xis' : 'http://www.xchanging.com/ACORD4ALLEDI/1',
         'ns' : 'http://www.ACORD.org/standards/Jv-Ins-Reinsurance/1' }
header = 'Jv-Ins-Reinsurance'
ns = 'xis:'
path = "'//" + ns + header + "'"    
p = tree.xpath('%s' % path, namespaces=nsmap)
print ('p = %s' % p)
for e in p:
    print(e.tag, e.text)

print(p)返回:

p = //xis:Jv-Ins-Reinsurance

我收到错误:AttributeError: 'str' object has no attribute 'tag'

我该怎么做?

由于

2 个答案:

答案 0 :(得分:1)

您可以尝试删除单引号吗?我认为你的path变量中有一个级别过多的引用。我只想使用path = "//" + ns + header

答案 1 :(得分:0)

您正在使用文字引号构建字符串。您不需要,省略'个字符。

path = "//" + ns + header
p = tree.xpath(path, namespaces=nsmap)

或使用字符串格式:

path = "//{}{}".format(ns, header)
p = tree.xpath(path, namespaces=nsmap)

您的原始版本相当于:

path = "'//xis:Jv-Ins-Reinsurance'"

(注意额外的单引号字符)。