javascript - 被迫处理 XML 文件中的 &,尝试解决解析错误 $.ajax({...})

标签 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% 确定它是贯穿始终的 & 符号。

我想也许可以使用 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' 表明您希望将数据作为文本传输,然后进行处理。

就您而言,数据处理涉及三个步骤:

  1. 将“&”替换为相应的 XML 实体:“&”
  2. 将结果字符串转换为 XML。
  3. 处理生成的 XML

可以这样写:

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

关于javascript - 被迫处理 XML 文件中的 &,尝试解决解析错误 $.ajax({...}),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26454465/

相关文章:

javascript - 使用 js 将 img 转换为灰度面临安全错误

java - 从资源中解析 XML 文件

javascript - 如何管理独立 react 组件之间的通信?

javascript - Firefox 调试器从 if block 直接跳转到 else block

javascript - 试图在我的 javascript 代码中理解 "this"(一件事有效,另一件事无效)

java - 将图像按钮与 TextView XML 对齐

c# - 更有效地过滤 XDocument

javascript - 调用另一个类的函数

javascript - js正则表达式替换第一部分

jquery - IE9 : Getting the value of 'MS Filter' property using jquery