【问题标题】:lxml and xml namespaces - Using find and findall to get XML Tag Valuelxml 和 xml 命名空间 - 使用 find 和 findall 获取 XML 标记值
【发布时间】:2014-03-01 10:10:39
【问题描述】:

我在使用 lxml 获取文本值和节点时遇到问题,其中 XML 文本中包含命名空间。我正在使用 findall('Status') 但结果总是为空。

我最终得到了以下工作代码....这是使用 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

【问题讨论】:

    标签: xml python-2.7 lxml xml-namespaces elementtree


    【解决方案1】:

    您无需手动构建nsmap

    替换以下行:

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

    与:

    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'
    

    【讨论】:

    • 这样更干净更好。我会落实你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2012-04-28
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多