python - 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'
解决方案
您可以编写自己的迭代器版本来执行您想要的操作:
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)
推荐阅读
- css - 单击输入时更改字体真棒图标颜色
- ionic-framework - 匆忙单击会导致路由问题
- java - 我的 Icecast Stream 没有在我的 android 应用程序中播放
- java - 插入 | 打印数组时每 2 个字符
- android - android studio web查看位置
- php - 在 Laravel 中找不到 Passport 的 AppServiceProvider 中的 $this->registerPolicies 方法
- keycloak - Keycloak 服务器重启后 Keycloak 访问令牌无效
- c# - UWP C#如何从 ListView 重新排列/重新排序 SQLite 数据库
- c# - 当我将新行写入 .txt 文件时,行已删除 - Windows 窗体
- css - 出现滚动条时,使用引导表边框类对齐表格边框不正确