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

2024-10-01 04:44:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

  1. 在xml文档中搜索一个子文档,其名称为fcsProtocolEF3
  2. 在fcsProtocolEF3中搜索名为“id”的元素

按元素名称搜索是至关重要的。不是按顺序排列的

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

它可以工作,但需要输入名称空间。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>

Tags: 文档名称idhttp元素ruexportxml
2条回答

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)

下面是基于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())

输出

0000000

相关问题 更多 >