Экранирование строк для использования в XML - PullRequest
29 голосов
/ 10 октября 2009

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

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

Ответы [ 5 ]

65 голосов
/ 10 октября 2009

Как то так?

>>> from xml.sax.saxutils import escape
>>> escape("< & >")   
'&lt; &amp; &gt;'
12 голосов
/ 10 октября 2009

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

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>'
11 голосов
/ 10 февраля 2016

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

from xml.sax.saxutils import escape

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

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

10 голосов
/ 24 февраля 2015

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 только заменит строку

4 голосов
/ 14 января 2014

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

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

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

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