我正在尝试将xml文件读入python,从xml文件中提取某些元素,然后将结果写回xml文件(所以基本上它是没有几个元素的原始xml文件)。当我使用.removeChild(源代码)时,它会删除我想要删除的各个元素,但会留下空白,使文件变得非常不可读。我知道我仍然可以解析包含所有空格的文件,但有时我需要手动更改某些元素属性的值,这会使执行此操作变得困难(而且很困难)。我当然可以手动删除空格,但是如果我有几十个这样的xml文件,那就不太可行了。
有没有办法在做.removeChild的同时也去掉空格?
下面是我的代码:
dom=parse(filename)
main=dom.childNodes[0]
sources = main.getElementsByTagName("source")
for source in sources :
name=source.getAttribute("name")
spatialModel=source.getElementsByTagName("spatialModel")
val1=float(spatialModel[0].getElementsByTagName("parameter")[0].getAttribute("value"))
val2=float(spatialModel[0].getElementsByTagName("parameter")[1].getAttribute("value"))
if angsep(val1,val2,X,Y)>=ROI :
main.removeChild(source)
else:
print name,val1,val2,angsep(val1,val2,X,Y)
f=open(outfile,"write")
f.write("<?xml version=\"1.0\" ?>\n")
f.write(dom.saveXML(main))
f.close()
非常感谢你的帮助。
发布于 2010-02-07 01:05:10
我不知道如何使用xml.dom.minidom做到这一点,所以我只是写了一个快速函数来读取输出文件,删除所有空行,然后重写到一个新文件:
f = open(xmlfile).readlines()
w = open('src_model.xml','w')
empty=re.compile('^$')
for line in open(xmlfile).readlines():
if empty.match(line):
continue
else:
w.write(line)
这对我来说已经足够好了:)
发布于 2010-02-06 05:46:56
如果您安装了PyXML,则可以使用xml.dom.ext.PrettyPrint()
发布于 2010-09-13 00:44:45
…用于搜索人:
这段有趣的代码片段
skey = lambda x: getattr(x, "tagName", None)
mainnode.childNodes = sorted(
[n for n in mainnode.childNodes if n.nodeType != n.TEXT_NODE],
cmp=lambda x, y: cmp(skey(y), skey(x)))
删除所有文本节点(并按标记名反向排序)。
也就是说,您可以(递归地)执行tr.childNodes = [recurseclean(n) for n in tr.childNodes if n.nodeType != n.TEXT_NODE]
来删除所有文本节点
或者,如果您需要包含一些数据的文本节点,您可能想要执行类似于… if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE)
的操作(我自己并没有尝试过)。或者更复杂的将文本留在特定标记中。
之后,tree.toprettyxml(…)
将返回格式良好的XML文本。
https://stackoverflow.com/questions/2210488
复制相似问题