Die akzeptierte Antwort von Andrey Vlasovskikh ist die vollständigste Antwort auf das OP. Aber dieses Thema taucht bei den häufigsten Suchen nach python escape xml
und ich wollte einen Zeitvergleich der drei diskutierten Lösungen anbieten Ich wollte einen Zeitvergleich der drei in diesem Artikel besprochenen Lösungen anbieten und außerdem eine vierte Option vorstellen, die wir aufgrund ihrer verbesserten Leistung gewählt haben.
Alle vier basieren entweder auf der nativen Python-Datenverarbeitung oder der Python-Standardbibliothek. Die Lösungen werden in der Reihenfolge von der langsamsten zur schnellsten Leistung angeboten.
Option 1 - regex
Diese Lösung verwendet die Python-Regex-Bibliothek. Sie liefert die langsamste Leistung:
import re
table = {
"<": "<",
">": ">",
"&": "&",
"'": "'",
'"': """,
}
pat = re.compile("({})".format("|".join(table)))
def xmlesc(txt):
return pat.sub(lambda match: table[match.group(0)], txt)
>>> %timeit xmlesc('<&>"\'')
1.48 µs ± 1.73 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Zu Ihrer Information: µs ist das Symbol für Mikrosekunden, was 1 Millionstel Sekunde entspricht. Die Fertigstellungszeiten der anderen Implementierungen werden in Nanosekunden (ns) gemessen, was dem Milliardstel einer Sekunde entspricht.
Möglichkeit 2: xml.sax.saxutils
Diese Lösung verwendet python xml.sax.saxutils
Bibliothek.
from xml.sax.saxutils import escape
def xmlesc(txt):
return escape(txt, entities={"'": "'", '"': """})
>>> %timeit xmlesc('<&>"\'')
832 ns ± 4.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Option 3 - str.replace
Diese Lösung verwendet die Zeichenfolge replace()
Methode. Unter der Haube implementiert sie eine ähnliche Logik wie Pythons xml.sax.saxutils
. Der saxutils-Code hat eine for-Schleife, die etwas Leistung kostet, was diese Version etwas schneller macht.
def xmlesc(txt):
txt = txt.replace("&", "&")
txt = txt.replace("<", "<")
txt = txt.replace(">", ">")
txt = txt.replace('"', """)
txt = txt.replace("'", "'")
return txt
>>> %timeit xmlesc('<&>"\'')
503 ns ± 0.725 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Option 4 - str.translate
Dies ist die schnellste Implementierung. Sie verwendet die Zeichenkette translate()
método.
table = str.maketrans({
"<": "<",
">": ">",
"&": "&",
"'": "'",
'"': """,
})
def xmlesc(txt):
return txt.translate(table)
>>> %timeit xmlesc('<&>"\'')
352 ns ± 0.177 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)