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

Python: стирание строк для использования в XML

Я использую Python xml.dom.minidom для создания XML-документа. (Логическая структура → XML-строка, а не наоборот).

Как я могу убедить строки, которые я предоставляю, чтобы они не могли испортить XML?

4b9b3361

Ответ 1

Вы имеете в виду, что вы делаете что-то вроде этого:

from xml.dom.minidom import Text, Element

t = Text()
e = Element('p')

t.data = '<bar><a/><baz spam="eggs"> & blabla &entity;</>'
e.appendChild(t)

Затем вы получите красивую экранированную строку XML:

>>> e.toxml()
'<p>&lt;bar&gt;&lt;a/&gt;&lt;baz spam=&quot;eggs&quot;&gt; &amp; blabla &amp;entity;&lt;/&gt;</p>'

Ответ 2

Что-то вроде этого?

>>> from xml.sax.saxutils import escape
>>> escape("< & >")   
'&lt; &amp; &gt;'

Ответ 3

xml.sax.saxutils.escape только escapes &, < и > по умолчанию, но он предоставляет параметр entities для дополнительного выхода из других строк:

from xml.sax.saxutils import escape

def xmlescape(data):
    return escape(data, entities={
        "'": "&apos;",
        "\"": "&quot;"
    })

xml.sax.saxutils.escape использует str.replace() внутренне, поэтому вы также можете пропустить импорт и написать свою собственную функцию, как показано в ответе MichealMoser.

Ответ 4

xml.sax.saxutils не пропускает символы котировки (")

Итак, вот еще один:

def escape( str ):
    str = str.replace("&", "&amp;")
    str = str.replace("<", "&lt;")
    str = str.replace(">", "&gt;")
    str = str.replace("\"", "&quot;")
    return str

если вы посмотрите, то xml.sax.saxutils только заменяет строку

Ответ 5

Если вы не хотите импортировать другой проект, и у вас уже есть cgi, вы можете использовать это:

>>> import cgi
>>> cgi.escape("< & >")
'&lt; &amp; &gt;'

Обратите внимание, однако, что с этой уязвимостью кода страдает - вы должны, вероятно, добавить его в функцию, чтобы лучше описать ваше намерение: (и написать для него единичные тесты, пока вы на нем;)

def xml_escape(s):
    return cgi.escape(s) # escapes "<", ">" and "&"