【问题标题】:How to access text in XML containing namespace using python ElementTree如何使用 python ElementTree 访问包含命名空间的 XML 中的文本
【发布时间】:2020-03-24 08:53:14
【问题描述】:

我有一个带有命名空间的简单 XML。我无法访问命名空间内的文本。 XML 如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
<!-- Created by IRIS Business Services Limited -->
<link:linkbase xmlns:xsi="http://www.ffff.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.uhtj.org/2006/ref http://www.frsfs.org/2006/ref-2006-02-27.xsd http://www.ghi.org/in-ghi-rep-par ../core/in-ghi-rep-par.xsd http://www.rl.org/2003/linkbase http://www.rl.org/2003/rl-linkbase-2003-12-31.xsd" xmlns:in-ghi-rep-par="http://www.ghi.org/in-ghi-rep-par" xmlns:link="http://www.rl.org/2003/linkbase" xmlns:ref="http://www.rl.org/2006/ref" xmlns:rli="http://www.rl.org/2003/instance" xmlns:xlink="http://www.ffff.org/1999/xlink">
  <link:referenceLink xlink:type="extended" xlink:role="http://www.rl.org/2003/role/link">
    <link:loc xlink:type="locator" xlink:href="../core/in-ghi-rep.xsd#in-ghi-rep_ReportingPeriodTable" xlink:label="in-ghi-rep_ReportingPeriodTable"/>
    <link:reference xlink:type="resource" xlink:label="res_1" xlink:role="http://www.rl.org/2003/role/disclosureRef" id="res_1">
      <in-ghi-rep-par:Circular>DBS.No.FBC.BC.34/13.12.001/99-2000  dt April 6, 2000</in-ghi-rep-par:Circular>
    </link:reference>
  </link:referenceLink>
</link:linkbase>

我要做的就是检索"DBS.No.FBC.BC.34/13.12.001/99-2000 dt April 6, 2000",它是循环值。

我当前的代码如下所示。我已经探索了 ElementTree,但仍然无法获得解决方案。

from lxml import etree

tree = etree.parse("s2.xml")
root = tree.getroot()
root2.nsmap
for Circular in root.findall('{http://www.ghi.org/in-ghi-rep-par}'):
    print (Circular.text)

我是解析 XML 的新手。请帮忙。

【问题讨论】:

    标签: python-3.x lxml elementtree


    【解决方案1】:

    您对 findall 的表述不正确。 findall 将根据您的表达式进行搜索,并且您当前告诉它只查看其所在的节点。在根节点中,没有具有此命名空间的节点,因此它正确返回一个空列表。因此,如果您在 Circular 标签所在的父节点中运行它,您的表达式就可以工作。但除了命名空间之外,您需要传递通配符来获取该命名空间的所有标签,或者如果您对 Circular 标签感兴趣,请指定它。

    print(root[0][1].findall('{http://www.ghi.org/in-ghi-rep-par}*'))
    print(root[0][1].findall('{http://www.ghi.org/in-ghi-rep-par}Circular'))
    

    但假设您不知道标签可能在 xml 中的位置,那么您可以从根目录搜索并使用 .// 告诉您的 xpath 压缩从该元素递归地在所有元素中查找它。同样,您需要为标签名称或实际标签名称提供通配符。

    print(root.findall('.//{http://www.ghi.org/in-ghi-rep-par}*'))
    print(root.findall('.//{http://www.ghi.org/in-ghi-rep-par}Circular'))
    

    例如:

    print(root.findall('.//{http://www.ghi.org/in-ghi-rep-par}Circular')[0].text)
    

    输出

    DBS.No.FBC.BC.34/13.12.001/99-2000  dt April 6, 2000
    

    【讨论】:

    • 所以你只需像以前一样使用循环。 for element in root.findall('.//{http://www.ghi.org/in-ghi-rep-par}*'): print(element.text)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2017-07-08
    • 2018-09-12
    • 1970-01-01
    • 2023-04-01
    • 2015-03-06
    相关资源
    最近更新 更多