如何使用python ElementTree访问包含名称空间的XML中的文本

问题描述 投票:0回答:1

我有一个带有名称空间的简单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个回答
0
投票

您的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
© www.soinside.com 2019 - 2024. All rights reserved.