Python:XMLElementTree(或lxml)中的名称空间
我想检索一个遗留xml文件,操作并保存它 这是我的密码:Python:XMLElementTree(或lxml)中的名称空间,python,xml,namespaces,elementtree,Python,Xml,Namespaces,Elementtree,我想检索一个遗留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 })
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文件在开始时没有
- 输出处的标记包含这样的
,而我需要输出为原始的
,开头没有名称空间
ns+“事件”
而不是“%(ns)事件”%{'ns':ns}
问题2:默认情况下,只有在需要时才编写XML声明。您可以在write()
调用中使用xml\u declaration=True
强制执行它(仅限lxml)
问题3:
nsmap
arg似乎仅为lxml。AFAICT它需要一个映射,而不是一个字符串。请尝试nsmap={None:NS}
。effbot文章中有一节介绍了解决此问题的方法。按顺序回答您的问题:
- 您不能忽略名称空间,不能忽略
使用的路径语法,也不能忽略“real”xpath(由lxml支持)中的名称空间:在这里,您仍然必须使用前缀,并且仍然需要提供一些前缀到uri的映射.findall()
- 使用
以及xml\u declaration=True
和encoding='utf-8'
调用(在lxml中可用,但在stdlib xml.etree中,我相信只有在python 2.7之后才有).write()
- 我相信lxml会按照您的意愿行事