当检索到包含转义(!)&符号的XML时,jQuery`ajax`调用会引发错误

时间:2012-10-22 14:28:07

标签: javascript xml ajax

客户端脚本获取文本输入中的文本,将其“包装”在XML块中,并将其发送到将信息存储在MySQL数据库中的服务器。

作为包装输入值之前的第一步,我逃避了“&”像这样的人物:

var copyright = copyright.replace(/&/g,"&");

使用jquery的ajax方法将生成的XML数据块发送到服务器:

var copyright = copyright.replace(/&/g,"&"),
    xml = "<request><session>"+session+"</session><space>"+space_id+"</space><view>"+view_id+"</view><copyright>"+copyright+"</copyright></request>",
    url = "hidden URL";

    $.ajax({ 
        type: "POST", 
        url: url,
        contentType: "text/xml; charset=UTF-8", 
        dataType: "xml;charset=UTF-8",
        data: xml
    });

在此操作之后,需要检索以前保存在数据库中的内容并在网页中显示:

$.ajax({ 
    type: "POST", 
    url: url,
    dataType: 'xml',
    data: xmlString, 
    success: function(xml) { 
          var XML = $(xml);
            // Process the data retrieved
    },
    error: function(jqXHR, textStatus, errorThrown) {
        var XML = $(jqXHR.responseText);
            console.log("error: "+textStatus+"\n"+errorThrown);
    }
});

如果在输入字段中键入&符号然后保存,则在尝试加载显示相同的先前保存内容的页面时,ajax调用会中断并运行error事件处理程序,并显示以下错误:

error: parsererror
Error: Invalid XML: <?xml version="1.0" encoding="UTF-8"?><response><target>    
<target_id>2095466</target_id>    
<plot>20029/13</plot>    
<builder>Lemminkäinen</builder>    
<housing_form>vm</housing_form>    
<block_name></block_name>    
<finnish_year>2013</finnish_year>    
<target_name>As Oy Helsingin Saukonranta</target_name>    
<target_address>Saukonpaadenranta 8</target_address>    
<office_space></office_space>    
<purpose></purpose>    
<reservations></reservations>    
<contacts></contacts>    
<infoflag>2</infoflag>    
<views>    
<view>    
<view_id>2095468</view_id>    
<copyright>B&M</copyright>    
</view>    
</views>    
</target>    
<status>OK</status><errormsg></errormsg></response> 

我做错了什么?我错误地逃避了角色,还是别的什么?

这个问题似乎是重复的,但对我而言似乎并不是这样,因为&符号在被存储之前已被转义。我甚至尝试在转义字符串中添加额外的(1,然后是两个)amp;,但结果完全相同。

2 个答案:

答案 0 :(得分:2)

事实证明,问题实际上来自服务器(我无权访问),处理请求的脚本没有正确地转义&符号,即使它们位于客户端。 Bellow是一个JavaScript函数,它可以逃避与XML一起使用的所有(?)特殊字符,以防有人需要它:

function escapeXML(string){

    var str = string;
    str = str.replace(/\&/g,"&amp;");
    str = str.replace(/\>/g,"&gt;");
    str = str.replace(/\</g,"&lt;");
    str = str.replace(/\"/g,"&quot;");
    str = str.replace(/\'/g,"&apos;");

    return str;
}

答案 1 :(得分:0)

问题是ä节点中Lemminkäinen的{​​{1}}字符,如 Shahid 所指示的那样。当builder文本被UTF-8解码时,Lemminkäinen将成为双字符UTF-8编码的一部分。因此,UTF-8解码器将尝试解码ä,这不是有效的字符序列。 äi的正确UTF-8编码字符为ä,或二进制为ä。因此,完整的UTF-8编码文本应为0xC3, 0xA4

当报告的XML数据保存在XML文件中,然后使用Web浏览器打开时,它将在所有主要Web浏览器上失败:Chrome(“编码错误”),Firefox(“格式不正确”),Safari(“编码错误”),MSIE(“在文本内容中找到无效字符。”),和Opera(“编码中的非法字节序列”)。

由于XML数据来自服务器,因此发布构建器数据的脚本可能没有指定UTF-8字符集(没有迹象表明提供的代码是一个这样做)。它可能是由旧脚本引起的,到目前为止已经修复,但损坏已经完成。即:将不正确的数据格式添加到数据库中。在服务器维护期间,手动输入数据库也是可能的原因。