You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python ElementTree访问带命名空间的英国法规XML元数据问题

搞定Python ElementTree访问带命名空间的XML元素

嘿,作为Python新手遇到XML命名空间的问题太正常啦!我来帮你一步步搞定这个英国法规元数据的访问问题~

先排查几个常见小问题

  1. 拼写错误要注意:你代码里写的ET.parse(statute_xmi_doc),这里的xmi应该是xml吧?这个小失误会直接导致解析失败,自然找不到目标元素。
  2. 确认命名空间URI正确:从你给的XML结构来看,ukm:前缀对应的命名空间确实是http://www.legislation.gov.uk/namespaces/metadata,你之前的写法是对的,但要确保XML里的ukm前缀确实绑定了这个URI(比如在<Legislation>元素里有xmlns:ukm="http://www.legislation.gov.uk/namespaces/metadata"这样的声明)。

更清晰的正确写法:用命名空间映射

ElementTree支持通过namespaces参数传入前缀和URI的映射,这样代码不仅可读性更高,还能避免手动写长URI时出错。

完整代码示例

import xml.etree.ElementTree as ET

# 先定义好所有用到的命名空间映射
ns_map = {
    "legislation": "http://www.legislation.gov.uk/namespaces/legislation",  # 根元素的默认命名空间
    "ukm": "http://www.legislation.gov.uk/namespaces/metadata",             # ukm前缀对应的命名空间
    "dc": "http://purl.org/dc/elements/1.1/"                                # dc前缀对应的命名空间
}

# 修正文件名拼写,解析XML文件(替换成你的实际文件路径或文件对象)
statute_tree = ET.parse("your_statute_file.xml")
statute_root = statute_tree.getroot()

# 方法1:用命名空间映射查找根元素下的直接子元素ukm:Metadata
metadata_elements = statute_root.findall("ukm:Metadata", namespaces=ns_map)

# 方法2:如果ukm:Metadata在XML的更深层级,用.//来递归查找所有匹配的元素
# metadata_elements = statute_root.findall(".//ukm:Metadata", namespaces=ns_map)

# 找到后可以继续访问dc:identifier等子元素
for metadata in metadata_elements:
    dc_identifier = metadata.find("dc:identifier", namespaces=ns_map)
    if dc_identifier:
        print(f"法规标识符:{dc_identifier.text}")

补充:直接用完整标签名的写法

如果你不想用命名空间映射,也可以继续用你之前的思路,但要确保路径正确:

# 查找根元素下的直接子元素ukm:Metadata
metadata_elements = statute_root.findall("{http://www.legislation.gov.uk/namespaces/metadata}Metadata")

# 查找dc:identifier子元素
for metadata in metadata_elements:
    dc_identifier = metadata.find("{http://purl.org/dc/elements/1.1/}identifier")
    if dc_identifier:
        print(f"法规标识符:{dc_identifier.text}")

如果还是找不到元素,建议先打印一下statute_root.tag看看根元素的完整标签名(会包含命名空间URI),再检查XML的实际结构,确认ukm:Metadata的层级是否和你预期的一致~


内容的提问来源于stack exchange,提问作者wikitect

火山引擎 最新活动