首页 > 解决方案 > OpenXML 标记格式

问题描述

我正在尝试从 Microsoft Word 文档中解析 Open XML。但是,每当我查看任何标签或属性时,我都会收到我想要的标签,前面是 openxmlformats 命名空间。下面的例子。有人知道我如何删除它,并且只收到我的标签 ID 和值吗?

当前格式:

for content in root.iter():
    print(content.tag)

返回:

'{http://schemas.openxmlformats.org/wordprocessingml/2006/main}tag'

for content in root.iter('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}tag'):
    print(content.attrib)

返回

 '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val': 'Orange'

期望的输出:

for content in root.iter():
    print(content.tag)

返回

tag

for content in root.iter('tag'):
    print(content.attrib)

返回

 val : 'Orange'

标签: pythonlxmlopenxmlelementtree

解决方案


您可以编写自己的迭代器版本来执行您想要的操作:

from collections import namedtuple
import re

my_content = namedtuple('my_content', ['tag', 'attrib'])

def remove_namespace(name):
    return re.sub('^\{[^\}]\}', '', name)

def my_iterator(root, tag=None, namespace='{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'):
    iterator = root.iter() if tag is None else root.iter(namespace + tag)
    for content in iterator:
        tag = remove_namespace(content.tag)
        attrib = {remove_namespace(key): val for key, val in content.attrib.items()}
        yield my_content(tag, attrib)

这将返回仅具有tagattrib属性的对象。如果您想要更详细的功能,则必须编写更复杂的代理对象。您可以使用生成器代替以前的生成器:

for content in my_iter(root):
    print(content.tag)

for content in my_iter(root, 'tag'):
    print(content.attrib)

推荐阅读