如何去除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
相关产品推荐
相关产品推荐

