python,xml:如何通过元素访问第三个子元素';名称

python,xml:如何通过元素访问第三个子元素';名称,python,python-3.x,xml,xml-parsing,xquery,Python,Python 3.x,Xml,Xml Parsing,Xquery,请帮我通过Python中的以下构造(我有lxml和xml.etree.ElementTree库)访问名为“id”的elemnt,好吗 理想结果:“0000000” 理想方法: 在xml文档中搜索一个子文档,其名称为fcsProtocolEF3 在fcsProtocolEF3中搜索名为“id”的元素 按元素名称搜索是至关重要的。不是按顺序排列的 我试着使用这样的东西:tree.findall('{http://zakupki.gov.ru/oos/export/1}fcsProtocolEF3')

请帮我通过Python中的以下构造(我有lxml和xml.etree.ElementTree库)访问名为“id”的elemnt,好吗

理想结果:“0000000” 理想方法:

  • 在xml文档中搜索一个子文档,其名称为fcsProtocolEF3
  • 在fcsProtocolEF3中搜索名为“id”的元素
  • 按元素名称搜索是至关重要的。不是按顺序排列的

    我试着使用这样的东西:
    tree.findall('{http://zakupki.gov.ru/oos/export/1}fcsProtocolEF3')[0]。findall('{http://zakupki.gov.ru/oos/types/1}id')[0]。文本

    它可以工作,但需要输入名称空间。XML文档有不同的名称空间,我不知道如何预先定义它们

    多谢各位

    在SQL中使用类似XQuery的东西会很好:

    value('(/*:export/*:fcsProtocolEF3/*:id)[1]', 'nvarchar(21)')) AS [id],
    
    XML文档:

    <?xml version="1.0" encoding="UTF-8" standalone="true"?>
     <ns2:export xmlns:ns3="http://zakupki.gov.ru/oos/common/1" xmlns:ns4="http://zakupki.gov.ru/oos/base/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns:ns10="http://zakupki.gov.ru/oos/printform/1" xmlns:ns11="http://zakupki.gov.ru/oos/control99/1" xmlns:ns9="http://zakupki.gov.ru/oos/SMTypes/1" xmlns:ns7="http://zakupki.gov.ru/oos/pprf615types/1" xmlns:ns8="http://zakupki.gov.ru/oos/EPtypes/1" xmlns:ns5="http://zakupki.gov.ru/oos/TPtypes/1" xmlns:ns6="http://zakupki.gov.ru/oos/CPtypes/1" xmlns="http://zakupki.gov.ru/oos/types/1">
       <ns2:fcsProtocolEF3 schemeVersion="10.2">
         <id>0000000</id>
         <purchaseNumber>0000000000000000</purchaseNumber>
       </ns2:fcsProtocolEF3>
     </ns2:export>
    
    
    0000000
    0000000000000000
    
    以下是基于ET的解决方案。有人在用手机

    import xml.etree.ElementTree as ET
    
    xml = '''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
     <ns2:export xmlns:ns3="http://zakupki.gov.ru/oos/common/1" xmlns:ns4="http://zakupki.gov.ru/oos/base/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns:ns10="http://zakupki.gov.ru/oos/printform/1" xmlns:ns11="http://zakupki.gov.ru/oos/control99/1" xmlns:ns9="http://zakupki.gov.ru/oos/SMTypes/1" xmlns:ns7="http://zakupki.gov.ru/oos/pprf615types/1" xmlns:ns8="http://zakupki.gov.ru/oos/EPtypes/1" xmlns:ns5="http://zakupki.gov.ru/oos/TPtypes/1" xmlns:ns6="http://zakupki.gov.ru/oos/CPtypes/1" xmlns="http://zakupki.gov.ru/oos/types/1">
       <ns2:fcsProtocolEF3 schemeVersion="10.2">
         <id>0000000</id>
         <purchaseNumber>0000000000000000</purchaseNumber>
       </ns2:fcsProtocolEF3>
     </ns2:export>
    
    '''
    
    def get_id_text():
      root = ET.fromstring(xml)
      fcs = root.find('{http://zakupki.gov.ru/oos/export/1}fcsProtocolEF3')
      # assuming there is one fcs element and one id under fcs
      return fcs.find('{http://zakupki.gov.ru/oos/types/1}id').text
    print(get_id_text())
    
    lxml溶液:

    xml = '''<?xml version="1.0"?>
     <ns2:export xmlns:ns3="http://zakupki.gov.ru/oos/common/1" xmlns:ns4="http://zakupki.gov.ru/oos/base/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns:ns10="http://zakupki.gov.ru/oos/printform/1" xmlns:ns11="http://zakupki.gov.ru/oos/control99/1" xmlns:ns9="http://zakupki.gov.ru/oos/SMTypes/1" xmlns:ns7="http://zakupki.gov.ru/oos/pprf615types/1" xmlns:ns8="http://zakupki.gov.ru/oos/EPtypes/1" xmlns:ns5="http://zakupki.gov.ru/oos/TPtypes/1" xmlns:ns6="http://zakupki.gov.ru/oos/CPtypes/1" xmlns="http://zakupki.gov.ru/oos/types/1">
       <ns2:fcsProtocolEF3 schemeVersion="10.2">
         <id>0000000</id>
         <purchaseNumber>0000000000000000</purchaseNumber>
       </ns2:fcsProtocolEF3>
     </ns2:export>'''
     
    from lxml import etree as et
    
    root = et.fromstring(xml)
    text = root.xpath('//*[local-name()="export"]/*[local-name()="fcsProtocolEF3"]/*[local-name()="id"]/text()')[0]
    print(text)
    
    xml=''
    0000000
    0000000000000000
    '''
    从lxml导入etree作为et
    root=et.fromstring(xml)
    text=root.xpath('/*[local-name()=“export”]/*[local-name()=“fcsProtocolEF3”]/*[local-name()=“id”]/text()”)[0]
    打印(文本)
    
    请上传有效的xml。当前的不是ValidHolderman,谢谢您的回复。我在文档中添加了结尾。您当前的解决方案有什么问题?因为XML文档是基于NS的,所以必须使用它们。你呢?你想要什么?亚历山德拉,非常感谢。这正是我需要的。文件中的NS可能因文件而异。唯一不变的是路径:extport/fcsProtocolEF3/id。因此,我需要一个不显式使用NS的解决方案。
    xml = '''<?xml version="1.0"?>
     <ns2:export xmlns:ns3="http://zakupki.gov.ru/oos/common/1" xmlns:ns4="http://zakupki.gov.ru/oos/base/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns:ns10="http://zakupki.gov.ru/oos/printform/1" xmlns:ns11="http://zakupki.gov.ru/oos/control99/1" xmlns:ns9="http://zakupki.gov.ru/oos/SMTypes/1" xmlns:ns7="http://zakupki.gov.ru/oos/pprf615types/1" xmlns:ns8="http://zakupki.gov.ru/oos/EPtypes/1" xmlns:ns5="http://zakupki.gov.ru/oos/TPtypes/1" xmlns:ns6="http://zakupki.gov.ru/oos/CPtypes/1" xmlns="http://zakupki.gov.ru/oos/types/1">
       <ns2:fcsProtocolEF3 schemeVersion="10.2">
         <id>0000000</id>
         <purchaseNumber>0000000000000000</purchaseNumber>
       </ns2:fcsProtocolEF3>
     </ns2:export>'''
     
    from lxml import etree as et
    
    root = et.fromstring(xml)
    text = root.xpath('//*[local-name()="export"]/*[local-name()="fcsProtocolEF3"]/*[local-name()="id"]/text()')[0]
    print(text)