OpenXML标记格式

时间:2018-05-22 15:07:02

标签: python lxml openxml elementtree

我正在尝试从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'

1 个答案:

答案 0 :(得分:0)

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

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)