python ,xml : how to access the 3rd child by element' name

标签 python python-3.x xml xml-parsing xquery

请您帮我通过以下 Python 构造来访问名称为“id”的 elemnt(我有 lxml 和 xml.etree.ElementTree 库)。

期望的结果:“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

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

最佳答案

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)

关于 python ,xml : how to access the 3rd child by element' name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64355192/

相关文章:

python - Numpy 一维数组 : Row or Column Matrix by Default?

安卓 : Editing layout files issue

python - 无法使用flask_sqlalchemy获得一对多关系,得到sqlalchemy.exc.InvalidRequestError

python - 匹配字符串时对 pandas 中的行进行条件计数

python - 存储在列表中的特定序列

python - 时间数据与格式不匹配

python - 如何打印可被 3 和 5 整除的 0 到 100 之间的数字?

python - 向 python 子进程发送复杂的 shell 命令

jquery - 如何解析这个 XML ajax 响应?

xml - 在scala中按属性对xml进行排序