Подтвердить что ты не робот

Пустые строки при использовании minidom.toprettyxml

Я использовал minidom.toprettyxml для префикса моего xml файла. Когда я создаю XML файл и использую этот метод, все работы решены, но если я его использую после изменения файла xml (для примера я добавил дополнительные узлы), а затем я возвращаю его в XML, Я получаю пустые строки, каждый раз, когда я его обновляю, у меня все больше и больше пустых строк...

мой код:

file.write(prettify(xmlRoot))


def prettify(elem):
    rough_string = xml.tostring(elem, 'utf-8') //xml as ElementTree
    reparsed = mini.parseString(rough_string) //mini as minidom
    return reparsed.toprettyxml(indent=" ")

и результат:

<?xml version="1.0" ?>
<testsuite errors="0" failures="3" name="TestSet_2013-01-23 14_28_00.510935" skip="0"     tests="3" time="142.695" timestamp="2013-01-23 14:28:00.515460">




    <testcase classname="TC test" name="t1" status="Failed" time="27.013"/>




    <testcase classname="TC test" name="t2" status="Failed" time="78.325"/>


    <testcase classname="TC test" name="t3" status="Failed" time="37.357"/>
</testsuite>

любые предложения?

спасибо.

4b9b3361

Ответ 1

Я нашел решение здесь: http://code.activestate.com/recipes/576750-pretty-print-xml/

Затем я изменил его, чтобы взять строку вместо файла.

from xml.dom.minidom import parseString

pretty_print = lambda data: '\n'.join([line for line in parseString(data).toprettyxml(indent=' '*2).split('\n') if line.strip()])

Вывод:

<?xml version="1.0" ?>
<testsuite errors="0" failures="3" name="TestSet_2013-01-23 14_28_00.510935" skip="0" tests="3" time="142.695" timestamp="2013-01-23 14:28:00.515460">
  <testcase classname="TC test" name="t1" status="Failed" time="27.013"/>
  <testcase classname="TC test" name="t2" status="Failed" time="78.325"/>
  <testcase classname="TC test" name="t3" status="Failed" time="37.357"/>
</testsuite>

Это может помочь вам немного сработать в вашей функции:

def new_prettify():
    reparsed = parseString(CONTENT)
    print '\n'.join([line for line in reparsed.toprettyxml(indent=' '*2).split('\n') if line.strip()])

Ответ 2

Я нашел легкое решение этой проблемы, просто изменив последнюю строку из вас prettify(), так что это будет:

def prettify(elem):
rough_string = xml.tostring(elem, 'utf-8') //xml as ElementTree
reparsed = mini.parseString(rough_string) //mini as minidom
return reparsed.toprettyxml(indent=" ", newl='')

Ответ 3

используйте это, чтобы решить проблему с линиями

toprettyxml(indent=' ', newl='\r', encoding="utf-8")

Ответ 4

У меня такая же проблема с Python 2.7 (32b) на машине под Windows 10. Проблема заключается в том, что когда python анализирует XML-текст на объект ElementTree, он добавляет некоторые раздражающие строки для атрибутов "text" или "tail" для каждого элемента.

Этот script удаляет такие символы прерывания строки:

def removeAnnoyingLines(elem):
    hasWords = re.compile("\\w")
    for element in elem.iter():
        if not re.search(hasWords,str(element.tail)):
            element.tail=""
        if not re.search(hasWords,str(element.text)):
            element.text = ""

Используйте эту функцию перед "красивой печатью" вашего дерева:

removeAnnoyingLines(element)
myXml = xml.dom.minidom.parseString(xml.etree.ElementTree.tostring(element))
print myXml.toprettyxml()

Это сработало для меня. Надеюсь, это сработает для вас!