【问题标题】:OpenXML Tag FormattingOpenXML 标记格式
【发布时间】:2018-05-22 15:07:02
【问题描述】:

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

【问题讨论】:

  • 添加一个为您执行此操作的包装函数。

标签: python lxml openxml elementtree


【解决方案1】:

您可以编写自己的迭代器版本来满足您的需求:

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)

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多