首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python xml.dom.minidom removeChild空格问题

Python xml.dom.minidom removeChild空格问题
EN

Stack Overflow用户
提问于 2010-02-06 05:16:48
回答 4查看 7.9K关注 0票数 1

我正在尝试将xml文件读入python,从xml文件中提取某些元素,然后将结果写回xml文件(所以基本上它是没有几个元素的原始xml文件)。当我使用.removeChild(源代码)时,它会删除我想要删除的各个元素,但会留下空白,使文件变得非常不可读。我知道我仍然可以解析包含所有空格的文件,但有时我需要手动更改某些元素属性的值,这会使执行此操作变得困难(而且很困难)。我当然可以手动删除空格,但是如果我有几十个这样的xml文件,那就不太可行了。

有没有办法在做.removeChild的同时也去掉空格?

下面是我的代码:

代码语言:javascript
运行
复制
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()

非常感谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-07 01:05:10

我不知道如何使用xml.dom.minidom做到这一点,所以我只是写了一个快速函数来读取输出文件,删除所有空行,然后重写到一个新文件:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2010-02-06 05:46:56

如果您安装了PyXML,则可以使用xml.dom.ext.PrettyPrint()

票数 1
EN

Stack Overflow用户

发布于 2010-09-13 00:44:45

…用于搜索人:

这段有趣的代码片段

代码语言:javascript
运行
复制
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文本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2210488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档