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

时间:2014-10-19 19:30:07

标签: javascript jquery xml

我被迫处理一个有多个&的XML文件。在其中,类似于:

<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%确定它的&amp;符号遍布整个。

我想也许dataFilter参数可用于清理响应,但这似乎只有在成功后才会被调用。我试图做像

这样的事情
function XMLFilter(data, type) {

    data = data.replace("&", "and");

    return data;
}

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

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

抨击负责允许&amp;在那里也有一个选项,但我不知道它将如何帮助最终用户。

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

1 个答案:

答案 0 :(得分:2)

您的$.ajax()未指定dataType。由于url设置具有.xml扩展名,因此JQuery推断传输的数据是XML(请参阅:http://api.jquery.com/jquery.ajax)。这是错误的,因为&amp;编码不正确。您必须表明要将数据作为文字dataType: 'text'一起传输,然后进行处理。

在您的情况下,数据处理涉及三个步骤:

  1. 取代“&amp;”使用相应的XML实体:“&amp; amp;”
  2. 将生成的字符串转换为XML。
  3. 处理生成的XML
  4. 这可以写成:

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