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

Как избежать объектов XML в javascript?

В JavaScript (на стороне сервера nodejs) Я пишу программу, которая генерирует xml в качестве вывода.

Я создаю xml, конкатенируя строку:

str += '<' + key + '>';
str += value;
str += '</' + key + '>';

Проблема в следующем: что, если value содержит символы типа '&', '>' или '<'? Какой лучший способ избежать этих символов?

или есть ли какая-либо библиотека javascript, вокруг которой могут скрываться объекты XML?

4b9b3361

Ответ 1

HTML-кодировка просто заменяет символы &, ", ', < и > с эквивалентами их сущностей. Вопросы заказа, если вы сначала не замените символы &, вы дважды закодируете некоторые из объектов:

if (!String.prototype.encodeHTML) {
  String.prototype.encodeHTML = function () {
    return this.replace(/&/g, '&amp;')
               .replace(/</g, '&lt;')
               .replace(/>/g, '&gt;')
               .replace(/"/g, '&quot;')
               .replace(/'/g, '&apos;');
  };
}

Как @Johan B.W. de Vries отметил, что это будет иметь проблемы с именами тегов, я хотел бы уточнить, что я сделал предположение, что это использовалось только для value

И наоборот, если вы хотите декодировать объекты HTML 1 убедитесь, что вы декодируете &amp; до & после всего остального, чтобы вы не удваиваете декодирование каких-либо объектов:

if (!String.prototype.decodeHTML) {
  String.prototype.decodeHTML = function () {
    return this.replace(/&apos;/g, "'")
               .replace(/&quot;/g, '"')
               .replace(/&gt;/g, '>')
               .replace(/&lt;/g, '<')
               .replace(/&amp;/g, '&');
  };
}

1 просто основы, не включая &copy; - © или другие подобные вещи


Что касается библиотек. Underscore.js (или Lodash, если хотите) предоставляет метод _.escape для выполнения этой функции.

Ответ 2

Это может быть немного более эффективным с тем же результатом:

function escapeXml(unsafe) {
    return unsafe.replace(/[<>&'"]/g, function (c) {
        switch (c) {
            case '<': return '&lt;';
            case '>': return '&gt;';
            case '&': return '&amp;';
            case '\'': return '&apos;';
            case '"': return '&quot;';
        }
    });
}

Ответ 3

Если у вас есть jQuery, здесь простое решение:

  String.prototype.htmlEscape = function() {
    return $('<div/>').text(this.toString()).html();
  };

Используйте его следующим образом:

"<foo&bar>".htmlEscape();"&lt;foo&amp;bar&gt"

Ответ 4

вы можете использовать метод ниже. Я добавил это в прототип для более легкого доступа. Я также использовал негативный внешний вид, поэтому он не будет беспорядочным, если вы вызываете метод дважды или более.

Применение:

 var original = "Hi&there";
 var escaped = original.EncodeXMLEscapeChars();  //Hi&amp;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, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
        OutPut = OutPut.replace(/&(?!(amp;)|(lt;)|(gt;)|(quot;)|(#39;)|(apos;))/g, "&amp;");
        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("<>&")); //&lt;&gt;&amp;

Ответ 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 '&quot;'
            case '"': return '&apos;'
            case '<': return '&lt;'
            case '>': return '&gt;'
            case '&': return '&amp;'
        }
    })
}

Ответ 9

Это просто:

sText = ("" + sText).split("<").join("&lt;").split(">").join("&gt;").split('"').join("&#34;").split("'").join("&#39;");