Как я могу удалить пробелы и разрывы строки в строке XML в Python 2.6? Я попробовал следующие пакеты:
etree: Этот отрывок сохраняет исходные пробелы:
xmlStr = '''<root>
<head></head>
<content></content>
</root>'''
xmlElement = xml.etree.ElementTree.XML(xmlStr)
xmlStr = xml.etree.ElementTree.tostring(xmlElement, 'UTF-8')
print xmlStr
Я не могу использовать Python 2.7, который обеспечил бы method
параметр.
minidom: все равно:
xmlDocument = xml.dom.minidom.parseString(xmlStr)
xmlStr = xmlDocument.toprettyxml(indent='', newl='', encoding='UTF-8')
Самым простым решением, вероятно, является использование lxml , где вы можете установить параметр синтаксического анализатора, чтобы игнорировать пробелы между элементами:
>>> from lxml import etree
>>> parser = etree.XMLParser(remove_blank_text=True)
>>> xml_str = '''<root>
>>> <head></head>
>>> <content></content>
>>> </root>'''
>>> elem = etree.XML(xml_str, parser=parser)
>>> print etree.tostring(elem)
<root><head/><content/></root>
Этого, вероятно, будет достаточно для ваших нужд, но некоторые предупреждения будут на безопасная сторона:
Это просто удалит узлы пробелов между элементами и попытается не удалять узлы пробелов внутри элементов со смешанным содержимым:
>>> elem = etree.XML('<p> spam <a>ham</a> <a>eggs</a></p>', parser=parser)
>>> print etree.tostring(elem)
<p> spam <a>ham</a> <a>eggs</a></p>
Начальные и конечные пробелы из текстовых узлов не будут удалены. Тем не менее, в некоторых случаях он все равно удаляет пробельные узлы из смешанного содержимого: если синтаксический анализатор еще не обнаружил непробельные узлы на этом уровне.
>>> elem = etree.XML('<p><a> ham</a> <a>eggs</a></p>', parser=parser)
>>> print etree.tostring(elem)
<p><a> ham</a><a>eggs</a></p>
Если вы этого не хотите, вы можете использовать xml: space = "preserve"
, что будет соблюдено. Другой вариант - использовать dtd и использовать etree.XMLParser (load_dtd = True)
, где синтаксический анализатор будет использовать dtd, чтобы определить, какие пробельные узлы значимы, а какие нет.
Кроме этого, вам придется написать свой собственный код для удаления ненужных пробелов (повторение потомков и, где это необходимо, установить .text
и .tail
свойства, содержащие только пробелы, до None
или пустую строку)
xmlStr = ' '.join(xmlStr.split()))
При этом весь текст помещается в одну строку, заменяя несколько пробелов одним пробелом.
xmlStr = ''.join(xmlStr.split()))
Это приведет к полному удалению пробелов, включая пробелы внутри текста, и не может быть использован.
Первая форма может быть использована с риском (но которую вы запрашиваете) для введенных вами данных:
xmlStr = '''<root>
<head></head>
<content></content>
</root>'''
xmlStr = ' '.join(xmlStr.split())
print xmlStr
""" Output:
<root> <head></head> <content></content> </root>
"""
Это будет действительный xml. Возможно, это нужно будет проверить с помощью какой-нибудь проверки xml. Кстати, вы уверены, что хотите XML? Вы читали статью: Python - это не Java
Пробельные символы имеют большое значение в XML-документе. Использование пробельных символов для отступов - это плохое использование XML, поскольку оно вводит значимые данные туда, где их на самом деле нет - и, к сожалению, это является нормой. Любой программный подход к удалению пробельных символов будет, в лучшем случае, предположением - вам нужно лучше знать, что передает XML, чтобы правильно удалить пробельные символы, не наступая на пятки некоторым элементам данных.