LXML和XML名称空间 - 使用查找和Findall获取XML标签值



我在使用XML文本中具有lxml的文本值和节点的文本值和节点中存在问题。我正在使用Findall("状态"),但结果总是到NULL。

我最终达到了以下工作代码。...这是使用LXML获取节点值的正确方法吗?我可以进一步改进吗?

import lxml
xml_string='<?xml version="1.0" encoding="UTF-8"?> <SCPP:Response xmlns:SCPP="http://www.SCPP.com/XMLSchema"> <SCPP:RESP_BODY> <Seed>001335834994</Seed> </SCPP:RESP_BODY> <SCPP:RESP_HDR> <Status>00</Status> </SCPP:RESP_HDR> </SCPP:Response>'
root = etree.fromstring(xml_string)
nsmap = {}
for ns in root.xpath('//namespace::*'):
    if ns[0]:
            nsmap[ns[0]] = ns[1]
#Method 1
print 'Status is ' , root.xpath('//SCPP:RESP_HDR', namespaces=nsmap)[0].find('Status').text
print 'Seed is ' , root.xpath('//SCPP:RESP_BODY', namespaces=nsmap)[0].find('Seed').text
#Method 2
print 'Status is ' , root.findall('SCPP:RESP_HDR',namespaces=nsmap)[0].find('Status').text
print 'Seed is ' , root.findall('SCPP:RESP_BODY',namespaces=nsmap)[0].find('Seed').text
#Method 3   
print 'Status is ' , root.xpath('//SCPP:RESP_HDR', namespaces=nsmap)[0].find('Status').text
print 'Seed is ' , root.find('SCPP:RESP_BODY',namespaces=nsmap).find('Seed').text

您不需要手动构建nsmap

替换以下行:

nsmap = {}
for ns in root.xpath('//namespace::*'):
    if ns[0]:
            nsmap[ns[0]] = ns[1]

with:

nsmap = root.nsmap

获取特定元素文本的另一种方法(使用xpath):

>>> root.xpath('.//SCPP:RESP_HDR/Status/text()', namespaces=nsmap)[0]
'00'
>>> root.xpath('.//SCPP:RESP_BODY/Seed/text()',namespaces=nsmap)[0]
'001335834994'

最新更新