Как избежать объектов XML в javascript?
В JavaScript (на стороне сервера nodejs) Я пишу программу, которая генерирует xml в качестве вывода.
Я создаю xml, конкатенируя строку:
str += '<' + key + '>';
str += value;
str += '</' + key + '>';
Проблема в следующем: что, если value
содержит символы типа '&'
, '>'
или '<'
?
Какой лучший способ избежать этих символов?
или есть ли какая-либо библиотека javascript, вокруг которой могут скрываться объекты XML?
Ответы
Ответ 1
HTML-кодировка просто заменяет символы &
, "
, '
, <
и >
с эквивалентами их сущностей. Вопросы заказа, если вы сначала не замените символы &
, вы дважды закодируете некоторые из объектов:
if (!String.prototype.encodeHTML) {
String.prototype.encodeHTML = function () {
return this.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
};
}
Как @Johan B.W. de Vries отметил, что это будет иметь проблемы с именами тегов, я хотел бы уточнить, что я сделал предположение, что это использовалось только для value
И наоборот, если вы хотите декодировать объекты HTML 1 убедитесь, что вы декодируете &
до &
после всего остального, чтобы вы не удваиваете декодирование каких-либо объектов:
if (!String.prototype.decodeHTML) {
String.prototype.decodeHTML = function () {
return this.replace(/'/g, "'")
.replace(/"/g, '"')
.replace(/>/g, '>')
.replace(/</g, '<')
.replace(/&/g, '&');
};
}
1 просто основы, не включая ©
- ©
или другие подобные вещи
Что касается библиотек. Underscore.js (или Lodash, если хотите) предоставляет метод _.escape
для выполнения этой функции.
Ответ 2
Это может быть немного более эффективным с тем же результатом:
function escapeXml(unsafe) {
return unsafe.replace(/[<>&'"]/g, function (c) {
switch (c) {
case '<': return '<';
case '>': return '>';
case '&': return '&';
case '\'': return ''';
case '"': return '"';
}
});
}
Ответ 3
Если у вас есть jQuery, здесь простое решение:
String.prototype.htmlEscape = function() {
return $('<div/>').text(this.toString()).html();
};
Используйте его следующим образом:
"<foo&bar>".htmlEscape();
→ "<foo&bar>"
Ответ 4
вы можете использовать метод ниже. Я добавил это в прототип для более легкого доступа.
Я также использовал негативный внешний вид, поэтому он не будет беспорядочным, если вы вызываете метод дважды или более.
Применение:
var original = "Hi&there";
var escaped = original.EncodeXMLEscapeChars(); //Hi&there
Декодирование автоматически обрабатывается в парсере XML.
Метод:
//String Extenstion to format string for xml content.
//Replces xml escape chracters to their equivalent html notation.
String.prototype.EncodeXMLEscapeChars = function () {
var OutPut = this;
if ($.trim(OutPut) != "") {
OutPut = OutPut.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
OutPut = OutPut.replace(/&(?!(amp;)|(lt;)|(gt;)|(quot;)|(#39;)|(apos;))/g, "&");
OutPut = OutPut.replace(/([^\\])((\\\\)*)\\(?![\\/{])/g, "$1\\\\$2"); //replaces odd backslash(\\) with even.
}
else {
OutPut = "";
}
return OutPut;
};
Ответ 5
Я изначально использовал принятый ответ в производственном коде и обнаружил, что он действительно очень медленный, когда он используется в значительной степени. Это гораздо более быстрое решение (работает с удвоенной скоростью):
var escapeXml = (function() {
var doc = document.implementation.createDocument("", "", null)
var el = doc.createElement("temp");
el.textContent = "temp";
el = el.firstChild;
var ser = new XMLSerializer();
return function(text) {
el.nodeValue = text;
return ser.serializeToString(el);
};
})();
console.log(escapeXml("<>&")); //<>&
Ответ 6
может быть, вы можете попробовать это,
function encodeXML(s) {
const dom = document.createElement('div')
dom.textContent = s
return dom.innerHTML
}
ссылка
Ответ 7
Технически, &, < и > недействительны символы имени сущности XML. Если вы не можете доверять ключевой переменной, вы должны отфильтровать их.
Если вы хотите, чтобы они были экранированы как объекты HTML, вы можете использовать что-то вроде http://www.strictly-software.com/htmlencode.
Ответ 8
если что-то сбежало из ранее, вы можете попробовать это, так как это не сбежит дважды, как многие другие
function escape(text) {
return String(text).replace(/(['"<>&'])(\w+;)?/g, (match, char, escaped) => {
if(escaped)
return match
switch(char) {
case '\'': return '"'
case '"': return '''
case '<': return '<'
case '>': return '>'
case '&': return '&'
}
})
}
Ответ 9
Это просто:
sText = ("" + sText).split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'");