Форматирование тегов OpenXML - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь проанализировать Open XML из документа Microsoft Word.Однако всякий раз, когда я иду посмотреть на любой тег или атрибут, я получаю нужный тег, которому предшествует пространство имен openxmlformats.Примеры ниже.Кто-нибудь знает, как я могу удалить это, и только получить мой идентификатор тега и значение?

Текущий формат:

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 голосов
/ 22 мая 2018

Вы можете написать свою собственную версию итератора, которая делает то, что вы хотите:

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)

Это вернет объекты, которые имеют только атрибуты tag и attrib.Вам нужно будет написать более сложный прокси-объект, если вы хотите более детальную функциональность.Вы можете использовать генератор в качестве замены предыдущего:

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

и

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