被迫处理一个&在XML文件中,试图解决解析错误$.ajax({..})

Forced to deal with a & in an XML file, trying to resolve parse error $.ajax({...})

本文关键字:解决 ajax 错误 文件 一个 处理 amp 被迫 XML      更新时间:2023-09-26

我被迫处理一个包含多个&中,类似于:

<row>
    <value>Boys & Girls</value>
</row>

这是我的方法:

$.ajax({
    type : "POST",
    url : "data.xml",
    dataFilter : XMLFilter, //handles raw response data of XMLHttpRequest. pre-filtering to sanitize response. 
    async : false, //false means this has to complete before continuing
    success : XMLLoadedSuccess, //to be called if the request succeeds. 
    error : function (XMLHttpRequest, textStatus, errorThrown) { debugger; },
    complete : XMLLoadedComplete //called when the request finishes after success / error callbacks are executed
});

错误报告为:

textStatus : parse error
errorThrown : InvalidXML

深入研究这个错误,我99.99%确信它是&符号贯穿始终。

我想也许dataFilter参数可以用来净化响应,但这似乎只有在成功之后才能调用。我试着做一些类似的事情

function XMLFilter(data, type) {
    data = data.replace("&", "and");
    return data;
}

有了它,但这显然不是怎么做的。

然后我想,用php加载/过滤掉&并编写一个新的XML文件,让jQuery使用它。这可能可行,但XML文件的大小大约为500k。因此,也许有一个cron作业,当生成新的XML时,它每天只做一次。

对允许&中也有一个选项,但我看不出它将如何帮助最终用户。

处理这个问题的好方法是什么?

您的$.ajax()没有指定dataType。由于url设置具有.xml扩展名,JQuery推断传输的数据是xml(请参阅:http://api.jquery.com/jquery.ajax)。这是错误的,因为&编码错误。您必须指示要使用dataType: 'text'text的形式传输数据,然后进行处理。

在您的案例中,数据处理涉及三个步骤:

  1. 用相应的XML实体替换"&"
  2. 将得到的字符串转换为XML
  3. 处理生成的XML

这可以写为:

$.ajax({
  ...
  url: "data.xml",
  dataType: 'text',
  success: function(data) {
                var xml = jQuery.parseXML(data.replace("&", "&amp;"));
                process(xml);
            },
  ...
});