You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中访问带有命名空间的XML节点属性?

如何在Python中访问带有命名空间的XML节点属性?

嗨,这个问题我之前处理SCAP合规XML的时候也踩过坑,咱们一步步理清楚~

首先你发现那些xmlns:*开头的“属性”没出现在root.attrib里,这是因为它们不是普通的XML属性,而是命名空间声明。Python的xml.etree.ElementTree解析器会自动把这些声明转换成元素的命名空间上下文,不会把它们放进常规的attrib字典里,所以直接打印attrib就看不到啦。

接下来分两种场景给你解决方案:

场景1:想获取所有命名空间前缀和对应URL的映射

比如你想知道ds:前缀对应哪个官方SCAP地址,有两个简单方法:

方法一:直接用get()方法单独获取

虽然命名空间声明不在attrib里,但你可以像调用普通属性一样,传入xmlns:前缀作为键来获取对应的URL:

import xml.etree.ElementTree as ET

tree = ET.parse('ssg-ubuntu2204-ds.xml')
root = tree.getroot()

# 获取ds前缀对应的命名空间URL
ds_ns = root.get('xmlns:ds')
print(ds_ns)  # 输出:http://scap.nist.gov/schema/scap/source/1.2

# 获取cpe-dict前缀对应的URL
cpe_dict_ns = root.get('xmlns:cpe-dict')
print(cpe_dict_ns)  # 输出:http://cpe.mitre.org/dictionary/2.0

方法二:批量捕获所有命名空间声明

如果想一次性拿到所有前缀和URL的映射,推荐用iterparse()监听start-ns事件,它会在解析到每个命名空间声明时触发:

import xml.etree.ElementTree as ET

namespace_map = {}

# 迭代解析XML,只捕获命名空间声明和根元素结束事件
for event, elem in ET.iterparse('ssg-ubuntu2204-ds.xml', events=('start-ns', 'end')):
    if event == 'start-ns':
        # elem是一个元组:(前缀, 对应的命名空间URL)
        prefix, uri = elem
        namespace_map[prefix] = uri
    elif event == 'end' and elem is root:
        # 拿到根元素的所有命名空间后就停止解析,提升效率
        break

# 现在可以直接通过前缀查URL
print(namespace_map['xccdf-1.2'])  # 输出:http://checklists.nist.gov/xccdf/1.2
print(namespace_map['linux'])      # 输出:http://oval.mitre.org/XMLSchema/oval-definitions-5#linux

场景2:想访问普通的带命名空间的属性

如果XML节点上有真正带命名空间的属性(比如dc:title="Ubuntu 22.04 Security Guide"这种),你需要用{命名空间URL}属性名的格式作为键来访问:

# 假设根元素有dc:title属性,先拿到dc的命名空间URL
dc_ns = namespace_map['dc']
# 用{URL}属性名的格式获取属性值
title = root.get(f'{dc_ns}title')
print(title)

再补充个小知识点

你看到根元素的tag其实是带命名空间的,比如打印root.tag会输出{http://scap.nist.gov/schema/scap/source/1.2}data-stream-collection,这就是ElementTree处理命名空间后的结果——把前缀替换成了完整的命名空间URL,用大括号包裹。

备注:内容来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:18:08