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

如何去除Open XML解析中的命名空间前缀,仅保留标签与属性信息?

解决Open XML解析中命名空间前缀的问题

这问题我处理Word文档Open XML的时候也碰到过,那些冗长的命名空间前缀确实影响代码可读性和输出整洁度,给你两个实用的解决思路:

方法1:注册命名空间+手动清理标签/属性

首先,我们可以给ElementTree注册Word的主命名空间,这样就能直接用短标签名(比如tag)来查找元素;然后遍历的时候手动去掉标签和属性键的命名空间前缀:

import xml.etree.ElementTree as ET

# 注册Word主命名空间,将空前缀映射到对应的URI
ET.register_namespace('', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main')

# 加载Word文档的主内容XML(路径根据实际解压后的docx文件调整)
tree = ET.parse('your_docx_file/word/document.xml')
root = tree.getroot()

# 遍历所有元素,打印不带前缀的标签
for content in root.iter():
    # 分割标签字符串,取}后面的部分
    clean_tag = content.tag.split('}')[-1]
    print(clean_tag)

# 直接用短标签名查找元素,同时清理属性前缀
for content in root.iter('tag'):
    # 遍历属性字典,清理每个键的命名空间前缀
    clean_attrib = {key.split('}')[-1]: value for key, value in content.attrib.items()}
    # 按照你期望的格式输出
    for k, v in clean_attrib.items():
        print(f"{k} : '{v}'")

执行这段代码后,就能得到你想要的输出:

  • 遍历标签时输出tag
  • 查找tag元素后输出val : 'Orange'

方法2:自定义工具函数简化操作

如果需要频繁处理命名空间,可以封装一个小工具函数,避免重复写分割逻辑:

import xml.etree.ElementTree as ET

def clean_tag(element):
    """去除元素标签的命名空间前缀"""
    return element.tag.split('}')[-1]

def clean_attrib(element):
    """去除元素属性键的命名空间前缀"""
    return {k.split('}')[-1]: v for k, v in element.attrib.items()}

# 注册命名空间(同上)
ET.register_namespace('', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main')

tree = ET.parse('your_docx_file/word/document.xml')
root = tree.getroot()

# 使用工具函数处理
for content in root.iter():
    print(clean_tag(content))

for content in root.iter('tag'):
    for k, v in clean_attrib(content).items():
        print(f"{k} : '{v}'")

原理说明

Open XML的标签和属性本质上是带命名空间URI的限定名,ElementTree会把它们存储为{URI}tag的格式。我们通过split('}')[-1]提取URI后面的纯标签名;而register_namespace则是告诉ElementTree,当我们使用短标签名(比如tag)时,对应到哪个命名空间的元素,这样root.iter('tag')就能正确匹配到目标元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:30:48