2010-02-05 123 views
1

我想读取一个xml文件到python中,从xml文件中拉出某些元素,然后将结果写回到一个xml文件(所以基本上它是原始的xml文件没有几个要素)。当我使用.removeChild(源代码)时,它会删除我想要删除的单个元素,但会留下空白区域,使文件变得无法读取。我知道我仍然可以用所有的空格解析文件,但有时候我需要手动修改某些元素的属性值,并且这样做很困难(并且非常麻烦)。我当然可以手动删除空白,但如果我有几十个这些XML文件不是真的可行的话。Python xml.dom.minidom removeChild空白问题

有没有办法做.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() 

感谢很多的帮助。

+1

你怎么写xml文件? 'Node.toxml()'?看'Node.toprettyxml()'和'Node.writexml()' –

+0

我试过用toxml()和toprettyxml()搞乱了,并且仍然得到了同样的问题, 。如果我找不到使用xml.dom.mini.dom的解决方案,我想我可以直接使用python搜索文档并删除所有空行,尽管对我来说这看起来很sl sl。 – Jamie

回答

1

我无法弄清楚如何使用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) 

这对我的作品不够好:)

1

如果你有安装的PyXML你可以使用xml.dom.ext.PrettyPrint()

1

...搜索PPL:

这个有趣的片段

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))) 

删除所有文本节点(并且还通过标记名对它们进行反向排序)。

I.e.你可以(递归地)做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文本。