客户端脚本获取文本输入中的文本,将其“包装”在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;
,但结果完全相同。
答案 0 :(得分:2)
事实证明,问题实际上来自服务器(我无权访问),处理请求的脚本没有正确地转义&符号,即使它们位于客户端。 Bellow是一个JavaScript函数,它可以逃避与XML一起使用的所有(?)特殊字符,以防有人需要它:
function escapeXML(string){
var str = string;
str = str.replace(/\&/g,"&");
str = str.replace(/\>/g,">");
str = str.replace(/\</g,"<");
str = str.replace(/\"/g,""");
str = str.replace(/\'/g,"'");
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字符集(没有迹象表明提供的代码是一个这样做)。它可能是由旧脚本引起的,到目前为止已经修复,但损坏已经完成。即:将不正确的数据格式添加到数据库中。在服务器维护期间,手动输入数据库也是可能的原因。