0

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

作为包装输入值之前的第一步,我像这样转义“&”字符:

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

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

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, then two) amp;,但结果完全相同。

4

2 回答 2

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;
}
于 2012-11-16T15:02:31.133 回答
0

问题是节点中的ä字符,正如Shahid所指出的那样。当文本被 UTF-8 解码时,它将成为两个字符的 UTF-8 编码的一部分。所以 UTF-8 解码器会尝试解码,这不是一个有效的字符序列。正确的 UTF-8 编码字符是,或二进制。因此,完整的 UTF-8 编码文本应该是.LemminkäinenbuilderLemminkäinenääiää0xC3, 0xA4Lemminkäinen

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

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

于 2012-10-23T03:36:38.373 回答