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



我有一个带有名称空间的简单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",它是Circular值。

我当前的代码如下所示。我已经探索了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的新手。请帮忙。

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 spression在该元素的所有元素中查找该标记。同样,您需要为标签名称或实际标签名称提供一个通配符。

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

最新更新