Python xml.dom.minidom removeChild проблема с пробелами - PullRequest
1 голос
/ 06 февраля 2010

Я пытаюсь прочитать 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()

Большое спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 06 февраля 2010

Я не мог понять, как это сделать, используя 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 голос
/ 12 сентября 2010

… для поиска чел:

Этот забавный фрагмент

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 голос
/ 06 февраля 2010

Если у вас установлен PyXML, вы можете использовать xml.dom.ext.PrettyPrint ()

...