编码XML实体,除非已经用Javascript编码

编码XML实体,除非已经用Javascript编码,javascript,xml,Javascript,Xml,我遇到的情况是,我为SOAP请求生成xml,并从第三方接收进入该xml的数据。此代码在服务器上运行,无法访问DOM中的函数。有时数据已经编码了xml实体,而有时则没有 例如,有时我会收到以下信息: Billy&Joe车库 其他时候我会收到: Billy&;乔's车库 我知道有一些解决方案可以处理第一个例子,就像在这篇文章中找到的那样: 但如果我将这些解决方案应用到第二个示例中,我将得到如下结果: function escapeXml(unsafe) { return un

我遇到的情况是,我为SOAP请求生成xml,并从第三方接收进入该xml的数据。此代码在服务器上运行,无法访问DOM中的函数。有时数据已经编码了xml实体,而有时则没有

例如,有时我会收到以下信息:
Billy&Joe车库

其他时候我会收到:
Billy&;乔's车库

我知道有一些解决方案可以处理第一个例子,就像在这篇文章中找到的那样:

但如果我将这些解决方案应用到第二个示例中,我将得到如下结果:

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;';
        }
    });
}

escapeXml("Billy &amp; Joe&apos;s Garage")
// Returns "Billy &amp;amp; Joe&amp;apos;s Garage"
函数escapeXml(不安全){
返回不安全。替换(/[&'”)/g,函数(c){
开关(c){
案例“”:返回“”;
大小写“&”:返回“&;”;
案例'\'':返回'&apos;';
案例'':返回';
}
});
}
escapeXml(“比利和乔的车库”)
//返回“比利&;amp;乔及;载脂蛋白;“汽车修理厂”

因此,对于第二个示例,所需的输出将与输入相同。

当然,真正的解决方法是拒绝损坏的XML并将其回退给供应商

使用,您可以排除任何紧跟
amp;
quot;
等的
&
事件

&(?!(amp|apos|lt|gt|quot);)
就这样

将此与您问题中的正则表达式结合起来,您应该能够绕过那些已经是公认实体一部分的符号,同时替换那些不是:

const re=/&(?!(amp|apos|lt|gt|quot)|['”]/g
函数escapeXml(不安全){
返回不安全。更换(re),功能(c){
开关(c){
案例“”:
返回“”;
案例“&”:
返回“&;”;
案例'\'':
返回“&apos;”;
案例'':
返回“”;
}
});
}

console.log(escapeXml(“Billy&;Joe&apos;s Garage&something.”)
我想,您应该意识到输入是不明确的,并且没有任何规则可以在100%的时间内给出正确的答案?谢谢,我忘记了前瞻表达式。是的,这是一个不寻常的情况,一开始就不应该发生。