Удалите пробелы в строке XML

Как я могу удалить пробелы и разрывы строки в строке 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')
21
задан kennytm 22 July 2010 в 15:41
поделиться

3 ответа

Самым простым решением, вероятно, является использование 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 или пустую строку)

36
ответ дан 29 November 2019 в 06:42
поделиться
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

-3
ответ дан 29 November 2019 в 06:42
поделиться

Пробельные символы имеют большое значение в XML-документе. Использование пробельных символов для отступов - это плохое использование XML, поскольку оно вводит значимые данные туда, где их на самом деле нет - и, к сожалению, это является нормой. Любой программный подход к удалению пробельных символов будет, в лучшем случае, предположением - вам нужно лучше знать, что передает XML, чтобы правильно удалить пробельные символы, не наступая на пятки некоторым элементам данных.

7
ответ дан 29 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: