2009-10-21 79 views
5

之间的XML命名空间和xhr.responseXML考虑一下:文件已加载时差异的jQuery与Opera和Firefox

<!DOCTYPE HTML> 
<html><head><title>XML-problem</title> 

<script src="jquery-1.3.2.min.js" type="text/javascript"></script> 

<script type="text/javascript"> 

$(function() { 
    $('<p/>').load("text.xml", function(responseText, textStatus, xhr) { 
     var xml = $(xhr.responseXML); 
     var x_txt = xml.find('atom\\:x').text(); 
     $(this).text(x_txt).appendTo('#container'); 
    }); 
}); 

</script> 

</head><body><div id="container" /></body></html> 

该脚本应该加载text.xml。 text.xml看起来是这样的:

<xml xmlns:atom="http://www.w3.org/2005/Atom"> 
    <atom:x>Text</atom:x> 
</xml> 

当这个文件已经被加载,atom:x -node的文本内容附加到文件。我可以在浏览器窗口中看到“文本”。

这在Firefox中按预期工作。但是,除非将查询从'atom\\:x'更改为'x',否则它在Opera中不起作用。在这种情况下,它适用于Opera,但不适用于Firefox。

我发现了一种解决方法,即将查询更改为'atom\\:x, x',但我更愿意深究这一点。


现在的有趣的转折:我可以通过改变

var xml = $(xhr.responseXML); 

内联XML,而不是直接从XHR得到它的进入

var xml = $('<xml xmlns:atom="http://www.w3.org/2005/Atom"><atom:x>Text</atom:x></xml>'); 

在这种情况下'atom\\:x'查询会在两个浏览器中给出期望的结果,并且仅在'x'将在两个浏览器中都不会产生结果。

事实上,这在Opera中的作用不同,这让我得出结论,前者的行为是Opera中的一个错误。这是一个合理的结论吗?我在哪里可以指出描述这种工作原理的标准?


结论:

  1. 什么是另类的变通针对此问题?比我找到的更好吗?
  2. 这是Opera中的错误吗?如果是的话,哪个标准是这样说的?

希望你能帮助:)

+2

貌似指出错误。 http://thompson-web.blogspot.com/2009/03/jquery-xml-and-namespaces.html http://dev.jquery.com/ticket/155 – 2009-10-21 15:28:48

+1

@Stefan:所以,jQuery应该只要查询'x',无论浏览器如何,都给我结果? – 2009-10-21 15:35:02

+0

你为什么使用'load'?加载应该是html,而不是xml。它可以与'ajax'或'get'一起使用吗? – Kobi 2009-10-21 17:47:27

回答

1

我想你应该说 “原子:X”(不带反斜杠),并一定要拥有的xmlns:原子=“HTTP://www.w3 .org/2005/Atom“声明,无论是在主html文件的html标记上,还是以其他一些已知的javascript方式。

+1

这将*不*工作。冒号是jquery中的特殊字符,必须逃脱。 – 2009-11-05 18:35:49

0

很难说这是否是Opera中的错误,或者这是否是Opera特有的jQuery中的错误。从它的声音来看,Opera没有正确地将命名空间添加到xhr文档dom中,这就是为什么jQuery无法查询atom:x并解释了为什么当您创建自己的jquery节点时,不会得到相同的结果。

我要做的第一件事就是试着看看原子是xhr dom中定义的namspace。它应该按照定义返回你的atom ns,否则,这可能是一个opera opera。我不知道测试这个最好的方法,但也许:xhr.getElementByTagNameNS("x" "http://www.w3.org/2005/Atom");将工作。

如果做不到这一点,歌剧院声称支持XML namespaces但是完全是这样,我会打开一个错误,请求使用jQuery,看看那得到的你。

在其他方面,正如我在我的评论中所隐含的,我不认为通过x查询是一个好主意。你可能不会使用命名空间,因为它会破坏目的。

+0

感谢您的提示。不幸的是,我无法马上测试它......我会回到你身边。 – 2009-11-06 09:12:23

2

我已经在同一个浏览器的不同版本中经历过这种行为,并且据我当时测试FF和IE测试有问题的页面的时间,所以我会说这不是Opera特定的错误。

我建议当你使用jQuery解析XML标签与命名空间前缀,您查询的选择既没有前缀。也就是说,不是使用

var x_txt = xml.find('atom\\:x').text(); 

尝试

var x_txt = xml.find('atom\\:x, x').text(); 

我觉得这是在大多数情况下可接受的解决办法,它会保证你的结果是,尽管不良行为是正确的,...

3

这不是Opera中的错误。这是the correct behavior

在一个命名空间的客户端,元素类型选择器的名称部分(命名空间分隔后的部分,如果存在的话)将只匹配对元素的限定名的本地部分。

在你的情况下,本地名称是xatom:xisn't even a legal local name in XML

此外,namespace-prefixed type selector在CSS具有不使用冒号在所有不同的语法:

@namespace atom url(http://www.w3.org/2005/Atom); 
atom|x { color: blue } 

你的语法似乎依赖于HTML解析器命名空间,不知道用户代理引入的一个怪癖。

HTML解析器“吃”冒号作为变量名称的一部分,你会得到在默认命名空间atom:x元素,这将匹配atom\:x选择,但在XML中,你在http://www.w3.org/2005/Atom命名空间得到x元素。