JavaScript (서버 측 nodejs)에서 xml을 출력으로 생성하는 프로그램을 작성하고 있습니다.
문자열을 연결하여 xml을 작성하고 있습니다.
str += '<' + key + '>';
str += value;
str += '</' + key + '>';
문제는 다음 value
과 같습니다. '&'
, '>'
또는 '<'
? 그 캐릭터를 탈출하는 가장 좋은 방법은 무엇입니까?
또는 XML 엔티티를 이스케이프 할 수있는 자바 스크립트 라이브러리가 있습니까?
답변
HTML 인코딩은 단순히 대체 &
, "
, '
, <
그리고 >
자신의 엔티티 등가물로 문자를. 순서가 중요합니다. &
먼저 문자를 바꾸지 않으면 일부 엔터티를 이중 인코딩합니다.
if (!String.prototype.encodeHTML) {
String.prototype.encodeHTML = function () {
return this.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
};
}
@Johan BW 드 브리스가 지적한 바와 같이,이 태그 이름에 문제가있을 것이다, 나는이가 사용되었다는 가정하에 작성 명확히하고 싶습니다 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
이 기능을 수행 하는 방법을 제공 합니다.
답변
이것은 동일한 결과로 좀 더 효율적일 수 있습니다.
function escapeXml(unsafe) {
return unsafe.replace(/[<>&'"]/g, function (c) {
switch (c) {
case '<': return '<';
case '>': return '>';
case '&': return '&';
case '\'': return ''';
case '"': return '"';
}
});
}
답변
jQuery가있는 경우 다음은 간단한 솔루션입니다.
String.prototype.htmlEscape = function() {
return $('<div/>').text(this.toString()).html();
};
다음과 같이 사용하십시오.
"<foo&bar>".htmlEscape();
-> "<foo&bar>"
답변
아래 방법을 사용할 수 있습니다. 쉽게 액세스 할 수 있도록 프로토 타입에 추가했습니다. 나는 또한 부정적인 미리보기를 사용했기 때문에 메소드를 두 번 이상 호출하면 일을 엉망으로 만들지 않을 것입니다.
용법:
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;
};
답변
나는 원래 프로덕션 코드에서 받아 들여진 대답을 사용했으며 실제로 많이 사용하면 실제로 느리다는 것을 알았습니다. 다음은 훨씬 더 빠른 솔루션입니다 (두 배 이상의 속도로 실행).
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("<>&")); //<>&
답변
시도해 볼 수 있습니다.
function encodeXML(s) {
const dom = document.createElement('div')
dom.textContent = s
return dom.innerHTML
}
답변
주의, XML 내부에 XML이 있으면 모든 정규식이 좋지 않습니다.
대신 문자열을 한 번 반복하고 모든 이스케이프 문자를 대체하십시오.
그렇게하면 같은 캐릭터를 두 번 넘을 수 없습니다.
function _xmlAttributeEscape(inputString)
{
var output = [];
for (var i = 0; i < inputString.length; ++i)
{
switch (inputString[i])
{
case '&':
output.push("&");
break;
case '"':
output.push(""");
break;
case "<":
output.push("<");
break;
case ">":
output.push(">");
break;
default:
output.push(inputString[i]);
}
}
return output.join("");
}