Я использую Python xml.dom.minidom
для создания XML-документа. (Логическая структура → XML-строка, а не наоборот).
Как я могу убедить строки, которые я предоставляю, чтобы они не могли испортить XML?
Я использую Python xml.dom.minidom
для создания XML-документа. (Логическая структура → XML-строка, а не наоборот).
Как я могу убедить строки, которые я предоставляю, чтобы они не могли испортить XML?
Вы имеете в виду, что вы делаете что-то вроде этого:
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><bar><a/><baz spam="eggs"> & blabla &entity;</></p>'
Что-то вроде этого?
>>> from xml.sax.saxutils import escape
>>> escape("< & >")
'< & >'
xml.sax.saxutils.escape
только escapes &
, <
и >
по умолчанию, но он предоставляет параметр entities
для дополнительного выхода из других строк:
from xml.sax.saxutils import escape
def xmlescape(data):
return escape(data, entities={
"'": "'",
"\"": """
})
xml.sax.saxutils.escape
использует str.replace()
внутренне, поэтому вы также можете пропустить импорт и написать свою собственную функцию, как показано в ответе MichealMoser.
xml.sax.saxutils не пропускает символы котировки (")
Итак, вот еще один:
def escape( str ):
str = str.replace("&", "&")
str = str.replace("<", "<")
str = str.replace(">", ">")
str = str.replace("\"", """)
return str
если вы посмотрите, то xml.sax.saxutils только заменяет строку
Если вы не хотите импортировать другой проект, и у вас уже есть cgi
, вы можете использовать это:
>>> import cgi
>>> cgi.escape("< & >")
'< & >'
Обратите внимание, однако, что с этой уязвимостью кода страдает - вы должны, вероятно, добавить его в функцию, чтобы лучше описать ваше намерение: (и написать для него единичные тесты, пока вы на нем;)
def xml_escape(s):
return cgi.escape(s) # escapes "<", ">" and "&"