我想检索旧版 xml 文件、操作并保存它。
这是我的代码:
from xml.etree import cElementTree as ET
NS = "{http://www.somedomain.com/XI/Traffic/10}"
def fix_xml(filename):
f = ET.parse(filename)
root = f.getroot()
eventlist = root.findall("%(ns)Event" % {'ns':NS })
xpath = "%(ns)sEventDetail/%(ns)sEventDescription" % {'ns':NS }
for event in eventlist:
desc = event.find(xpath)
desc.text = desc.text.upper() # do some editting to the text.
ET.ElementTree(root, nsmap=NS).write("out.xml", encoding="utf-8")
shorten_xml("test.xml")
我加载的文件包含:
xmlns="http://www.somedomain.com/XI/Traffic/10"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.somedomain.com/XI/Traffic/10 10.xds"
在根标签处。
我有以下与命名空间相关的问题:
- 如您所见,对于每个标记调用,我在开头给出了命名空间以检索子项。
- 生成的xml文件没有
<?xml version="1.0" encoding="utf-8"?>
一开始。
- 输出的标签包含这样的
<ns0:eventDescription>
虽然我需要输出作为原始的<eventDescription>
,开头没有命名空间。
这些如何解决呢?
看看有关命名空间的 lxml 教程部分。还有这个关于 ElementTree 中的命名空间的文章.
问题一:像其他人一样忍受它。代替"%(ns)Event" % {'ns':NS }
try NS+"Event"
.
问题2:默认情况下,仅在需要时才写入XML 声明。您可以通过使用强制它(仅lxml)xml_declaration=True
在你的write()
call.
问题3:nsmap
arg 似乎仅限于 lxml。 AFAICT 它需要一个映射,而不是一个字符串。尝试nsmap={None: NS}
。 effbot 文章中有一节描述了此问题的解决方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)