Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检索包含转义(!)符号的XML时,jQuery`ajax`调用抛出错误_Javascript_Xml_Ajax - Fatal编程技术网

Javascript 检索包含转义(!)符号的XML时,jQuery`ajax`调用抛出错误

Javascript 检索包含转义(!)符号的XML时,jQuery`ajax`调用抛出错误,javascript,xml,ajax,Javascript,Xml,Ajax,客户端脚本接收文本输入中的文本,将其“包装”到XML块中,并将其发送到将信息存储在MySQL数据库中的服务器 作为包装输入值之前的第一步,我对“&”字符进行如下转义: var copyright = copyright.replace(/&/g,"&amp;"); 使用jquery的ajax方法将生成的XML数据块发送到服务器: var copyright = copyright.replace(/&/g,"&amp;"), xml = "<req

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

作为包装输入值之前的第一步,我对“&”字符进行如下转义:

var copyright = copyright.replace(/&/g,"&amp;");
使用jquery的
ajax
方法将生成的XML数据块发送到服务器:

var copyright = copyright.replace(/&/g,"&amp;"),
    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调用将中断并运行
错误
事件处理程序,错误如下:

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> 
错误:parserror
错误:无效的XML:
2095466
20029/13    
莱明克宁
虚拟机
2013
作为奥伊·赫尔辛金·索孔兰塔
魔芋属8
2.
2095468
B&M
好啊
我做错了什么?我是在错误地逃避角色,还是其他原因


这个问题似乎是重复的,但对我来说似乎不是这样,因为在存储之前,符号和字符已经转义了。我甚至尝试添加额外的(1,然后两个)
amp
s到转义字符串,但结果完全相同。

问题在于
builder
节点中
Lemminkäinen
字符,正如Shahid所指出的。当
Lemminkäinen
文本被UTF-8解码时,
a
将是两个字符UTF-8编码的一部分。因此UTF-8解码器将尝试解码
äi
,这不是有效的字符序列。
ä
的正确UTF-8编码字符是二进制的
Ã
0xC3、0xA4
。因此,完整的UTF-8编码文本应该是
LemminkÕinen

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


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

事实证明,问题实际上来自服务器(我没有访问权限),处理请求的脚本没有正确转义符号和字符,即使它们位于客户端。 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;
}
函数escapeXML(字符串){
var-str=字符串;
str=str.replace(/\&/g,“&;”);
str=str.replace(/\>/g,“”);

str=str.replace(/\n不确定这是问题还是打字错误,但不应
var-copyright=copyright.replace(/&/g,“&;”),
be-var-copyright=copyright.replace(/&/g),“&;”,`?不确定,但请尝试此
var-copyright=copyright.replace(/&/g,“&;”)
您可能需要在
Lemminkäinen
和其他非ASCII字符中转义
ä
。请看,与
replace
一起使用的regexp格式并不是问题的根源,这里是发送到服务器的XML块(在转义了符号和字符之后):
{D7CEFA2E}20815612081563Kirsi Korhonen ja Mika Penttil A&T
。原始字符串为“[…]A&T”。特殊字符不会导致任何问题,仅当字符串包含符号和字符时,调用才会触发
错误
事件处理程序。
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;
}