使用JQuery解析XML与CDATA

编辑:我在这里遗漏了两件事。 AJAX调用返回的标头中缺少“Content-Type:text / xml”,这阻止了JQuery将返回的数据视为文档。 一旦正确处理,此代码正确解析并仅输出索引和项目名称。

$("a.getprojects").click(function(d){ d.preventDefault(); var api_token = $("#token").val(); var form_fbod = $("#fbod").val(); $.post("fbinfo.php", {fbod: form_fbod, token: api_token, cmd : 'listProjects', extra:''}, function(returned_xml) { var output = ''; $(returned_xml).find("project").each(function(){ var project = $(this); output += project.find("ixProject").text(); output += " "; output += project.find("sProject").text(); output += "\n"; }); $("#output").val(output); }); }); 

原文 :我很高兴使用FogBugz API和JQuery来组合我认为将是一个很酷的小工具,但我遇到了JQuery限制。 CDATA标签似乎混淆了它。

这是我正在使用的代码:

  $("a.getprojects").click(function(d){ d.preventDefault(); var api_token = $("#token").val(); var form_fbod = $("#fbod").val(); $.post("fbinfo.php", {fbod: form_fbod, token: api_token, cmd : 'listProjects', extra:''}, function(xml) { var output = xml; $(xml).find("project").each(function(){ var project = $(this); output += "\n\n"; output += project.html(); }); $("#output").val(output); }); }); 

这是我得到的输出:

    2  2    true 1 1    1  2    false 1 1     2  2    true 1 1  1  2    false 1 1  

似乎JQuery原生的XML解析丢弃了CDATA元素的内容。 FogBugz将大部分字符串数据放在CDATA标签中,因为我们在大多数地方都允许使用特殊字符和标点符号。 将输出封装在CDATA标签中可以让我们相对放心,我们通过API发回有效数据。 PHP的PHP解析工作得很好。 我的在线研究让一些人抱怨这一点,但没有多少工作要做。 有了JQuery的可扩展性,我认为那里有一些东西。 有没有其他人完成这个?

似乎是JQuery原生的XML解析

jQuery没有原生的XML解析。 它只使用标准的XMLHttpRequest.responseXML属性来获取响应的XML DOM。

丢弃CDATA元素的内容

你发送回复的内容类型是什么? 因为我怀疑它根本没有被解析为XML。 在这种情况下,jQuery将向您传回一个文档字符串,而不是XML DOM。

然后当你调用“$(xml)”时,它将从该字符串(*)创建文档内容 – 解析为HTML, 而不是 XML。 在HTML中没有CDATA部分,因此浏览器可能会丢弃它们,或将它们视为注释。

我怀疑这是因为当文档是XML时,“project.html()”实际上不应该工作。 ‘html()’只返回与标准’innerHTML’属性(**)相同的内容,它只适用于HTML文档; 它在XML元素上是未定义的。

将输出封装在CDATA标签中可以让我们相对放心,我们通过API发回有效数据。

好吧,’相对’:如果你的数据恰好包含“]]>”你仍然输了。 <![CDATA [部分旨在提高手写作的可写性; 机器生成的XML应该只是以正常方式使用实体编码。 通常,服务器应用程序应该使用适当的XML工具来生成响应,在这种情况下,这将自动完成。

(*:我从未理解jQuery何时感觉需要将文档片段创建和CSS选择压缩到同一个函数中。它们是完全不同的操作,您不希望混淆,这可能发生在这里。)

(**:实际上,它试图首先使用正则表达式过滤掉jQuery自定义属性。不幸的是,由于正则表达式无法解析HTML,因此它会愉快地过滤掉恰好看起来像HTML属性的文本的有效部分。哎呀。不是其中之一jQuery更漂亮的部分。)

事实上,jquery确实有一个xml解析器,可以解决你的问题。 $ .parseXML(xml) http://api.jquery.com/jQuery.parseXML/

Interesting Posts