如何使用 python ElementTree 访问包含命名空间的 XML 中的文本
How to access text in XML containing namespace using python ElementTree
我有一个带有命名空间的简单 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 将根据您的表达式进行搜索,并且您当前告诉它仅查看其所在的节点。在根节点中没有具有此名称的节点space 因此它正确地returns 一个空列表。因此,如果您在 Circular 标记所在的父节点中 运行 它,您的表达式就可以工作。但除了名称 space 之外,您需要传递通配符以获取该名称的所有标签 space,或者如果您对 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
我有一个带有命名空间的简单 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 将根据您的表达式进行搜索,并且您当前告诉它仅查看其所在的节点。在根节点中没有具有此名称的节点space 因此它正确地returns 一个空列表。因此,如果您在 Circular 标记所在的父节点中 运行 它,您的表达式就可以工作。但除了名称 space 之外,您需要传递通配符以获取该名称的所有标签 space,或者如果您对 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