【发布时间】:2018-05-24 14:43:57
【问题描述】:
我一直在使用 xml.etree.ElementTree 来解析 Word XML 文档。进行更改后,我使用tree.write('test.xml') 将树写入文件。保存 XML 后,Word 无法读取该文件。查看 XML,似乎新 XML 已重命名所有名称空间。
例如 w:t 变成 ns2:t
import xml.etree.ElementTree as ET
import re
tree = ET.parse('FL0809spec2.xml')
root = tree.getroot()
l = [' ',' ']
prev = None
count = 0
for t in root.iter('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}t'):
l[0] = l[1]
l[1] = t.text
if(l[0] <> '' and l[1] <> '' and re.search(r'[a-zA-Z]', l[0][len(l[0]) - 1]) and re.search(r'[a-z]', l[1][0])):
words = re.findall(r'(\b\w+\b)(\W+)',l[1])
if(len(words) > 0):
prev.text = prev.text + words[0][0]
t.text = t.text[len(words[0][0]):]
count += 1
prev = t
tree.write('FL0809spec2Improved.xml')
【问题讨论】:
-
a) 如果您的代码没有做任何更改,只是直接写回,命名空间名称是否会更改? b)只要命名空间定义相同,在 XML 术语中,我认为命名空间的实际名称是什么并不重要 - 问题可能是单词而不是 ElementTree
-
正如您在代码中看到的,在 ElemenTree 中,对 t 命名空间的引用不是物理 XML 中的名称,而是命名空间 URI。
-
有没有办法强制 ElementTree 使用与原来相同的命名空间引用?
-
不知道 - 去看看源代码?
-
看起来 lxml 可以更好地控制命名空间前缀(显然正确的术语是前缀)参见lxml.de/tutorial.html#namespaces 和 nsmap - 除此之外,我相信 lxml 具有与 ElementTree 类似的 API,因此可能不需要其他更改
标签: python xml-parsing