XML 5617:非法XML字符Internet Explorer 9

时间:2014-02-27 09:35:32

标签: jquery xml internet-explorer

我有以下xml文件:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<root>
  <branch>
     <name>Ale Torg</name>
     <address>Ale Torg</address>
     <city>NÖDINGE</city>
     <phone>0303-    336730</phone>
     <clnr>6854</clnr>
     <open>må-on 10-16, to 10-18, fr 10-16</open></branch>
 <branch>
     <name>Alfta</name>
     <address>LÅNGGATAN 59</address>
     <city>ALFTA</city>
     <phone>0271-61960</phone>
     <clnr>6402</clnr>
     <open>må 9-17, ti-on 9-15, to 9-17, fr 9-15</open>
</branch>
<branch>
    <name>Alingsås</name>
    <address>Kungsgatan 24</address>
    <city>ALINGSÅS</city>   
    <phone>0322-667280</phone>
    <clnr>6832</clnr>
    <open>må 10-18, ti-on 10-15, to 10-18, fr 10-15</open>
</branch>
<branch>
      <name>Alvesta</name>
      <address>Centralplan</address>
      <city>ALVESTA</city>
      <phone>0472-267760</phone>
      <clnr>6679</clnr>
      <open>må-on 10-15, to 10-18, fr 10-15</open>
</branch>
</root>

以下js解析它:

function encodeSwedishChars(data)
{
      data = data.replace(/å/g, '%E5');
      data = data.replace(/ä/g, '%E4');
      data = data.replace(/ö/g, '%F6');
      data = data.replace(/Å/g, '%C5');
      data = data.replace(/Ä/g, '%C4');
      data = data.replace(/Ö/g, '%D6');
      data = data.replace(/é/g,'%E9');
      data = data.replace(/É/g, '%C9');

      return data;
}

function addAutoComplete()
{
  //Use datatype TEXT so jquery doesnt parse it.
  var officeNames = [];
  $.ajax({
    url: "offices2.xml",
    dataType: "text",
    type: "GET",
    success: function(xml)
    {
      xml = xml.encodeSwedishChars();
      xml = $.parseXML(xml);

      var names = $(xml).find("branch").each(function(){
        var text = $(this).find('name').text();
        officeNames.push(text);

        var office = {};
        office.name = text;
        office.clnr = $(this).find("clnr").text();

        namesAndClnr.push(office);

      });
    }
  });

  $( "#guide-lastpage-form-p9" ).autocomplete({
      source: officeNames,
    })
}

代码在我测试的所有浏览器中都能正常运行,但在Internet Explorer 9中却没有... 我收到以下错误:

SCRIPT5022 Invalid XML: <?xml version=1.0" encoding="ISO-8859-1" ?>
jquery.min.js, line 4 character 4106

XML5617: Illegal XML character
, line 3 characther 66 (This is the letter Ö the first branch, city, Nödinge)

我无法更改XML文件中的任何内容,因为我无权访问它,offices2.xml只是一个测试文件,其数据与我在实际网站上收到的数据完全相同。

为什么这不起作用?我认为我的escapeSwedishChars方法会修复它吗?

我无法访问XML文件,因此我无法更改编码为UTF-8

1 个答案:

答案 0 :(得分:1)

(免责声明:虽然这个问题不是一个完整的答案,但是把它作为评论太长了,我相信这些信息可以节省时间给别人,所以我把它作为答案。怜悯downvotes!)

微软的解决方案巨大的BUG 就是这样:

  

在XML处理指令中指定正确的编码方案。

     
      
  • 或 -
  •   
     

将XML数据重新编码为正确的UTF-8。

来源:http://support.microsoft.com/kb/238833

不幸的是,第二个让我们说“解决方案”在大多数情况下都不适用,并且在我们只通过Ajax请求信息的大多数环境中,第一个选项都没用。

就我而言,我发现了两种不同的不良行为,具体取决于我用来请求数据的对象。当我使用XMLHttpRequest时,生成的responseText已经损坏(当然,responseXML是未定义的)并且与它几乎没有关系。

但是,我已经设法通过使用XDomainRequest对象(不应该用于此目的)来发出请求,但至少responseText仍然可读。不幸的是,所有非ASCII字符的char值都设置为65533,这是不可打印字符的代码,因此我能够实现的最好的方法是读取它们并替换某些特定的标记,这使得与a无法区分。一个。但至少生成的XML格式正确,我可以读取数据。