javascript - 除非已经在 Javascript 中编码,否则对 XML 实体进行编码
问题描述
我有一种情况,我正在为 SOAP 请求生成 xml,并从第 3 方接收进入该 xml 的数据。此代码在服务器上运行,无法访问 DOM 中的函数。有时数据会包含已编码的 xml 实体,有时则不会。
例如有时我会收到这个:
Billy & Joe's Garage
其他时候我会收到这个:
Billy & Joe's Garage
我知道有处理第一个示例的解决方案,例如在这篇文章中找到的示例:如何在 javascript 中转义 xml 实体?
但是,如果我将这些解决方案应用于第二个示例,我将得到如下信息:
function escapeXml(unsafe) {
return unsafe.replace(/[<>&'"]/g, function (c) {
switch (c) {
case '<': return '<';
case '>': return '>';
case '&': return '&';
case '\'': return ''';
case '"': return '"';
}
});
}
escapeXml("Billy & Joe's Garage")
// Returns "Billy &amp; Joe&apos;s Garage"
因此,对于第二个示例,所需的输出将与输入相同。
解决方案
当然,真正的解决办法是拒绝损坏的 XML 并将其退回给供应商。同时...
使用否定前瞻断言,您可以排除&
后面出现的任何事件amp;
,quot;
等等。
&(?!(amp|apos|lt|gt|quot);)
会这样做。
将此与您问题中的正则表达式结合起来,您应该能够绕过那些已经是已识别实体的一部分的&符号,同时替换那些不是:
const re = /&(?!(amp|apos|lt|gt|quot);)|[<>'"]/g
function escapeXml(unsafe) {
return unsafe.replace(re, function(c) {
switch (c) {
case '<':
return '<';
case '>':
return '>';
case '&':
return '&';
case '\'':
return ''';
case '"':
return '"';
}
});
}
console.log(escapeXml("'Billy & Joe's Garage & something else'"))
推荐阅读
- delphi - 有没有办法可以发送带有 httprequest.post 方法的 TFileStream 并以某种方式在我的网络经纪人中提取它?
- apache-spark - 将数据转化为rdd并分析
- c# - 如何验证来自不同发行者的 jwt 令牌
- tensorflow - 为什么随着训练步骤的增加,mAP 的图没有上升?
- sql - 使用 XML 进行 SQL 查询的正确语法
- c# - Bot Framework:提示和重试提示信息同时出现
- c++ - 未找到:操作类型未注册“重采样器”已注册在此进程中运行的二进制文件中
- r - R不会将日期格式更改为指定类型
- delphi - Delphi:计算自动换行文本所需的矩形高度
- r - 删除列中字符串的特定部分