使用JQuery使用CDATA解析XML

使用JQuery使用CDATA解析XML,jquery,xml,parsing,fogbugz,fogbugz-on-demand,Jquery,Xml,Parsing,Fogbugz,Fogbugz On Demand,编辑:我在这里遗漏了两件事。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

编辑:我在这里遗漏了两件事。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);
  });
});
原创:我很高兴使用和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);

    });
  });
这是我得到的结果:

<?xml version="1.0" encoding="UTF-8"?><response>
    <projects>
<project>
<ixProject>2</ixProject>
<sProject><![CDATA[Inbox]]></sProject>
<ixPersonOwner>2</ixPersonOwner>
<sPersonOwner><![CDATA[Rich]]></sPersonOwner>
<sEmail><![CDATA[rich@example.com]]></sEmail>
<sPhone></sPhone>
<fInbox>true</fInbox>
<ixGroup>1</ixGroup>
<iType>1</iType>
<sGroup><![CDATA[Internal]]></sGroup>
</project>

<project>
<ixProject>1</ixProject>
<sProject><![CDATA[Sample Project]]></sProject>
<ixPersonOwner>2</ixPersonOwner>
<sPersonOwner><![CDATA[Rich]]></sPersonOwner>
<sEmail><![CDATA[rich@example.com]]></sEmail>
<sPhone></sPhone>
<fInbox>false</fInbox>
<ixGroup>1</ixGroup>
<iType>1</iType>
<sGroup><![CDATA[Internal]]></sGroup>
</project>
</projects>
</response>

<ixproject>2</ixproject>
<sproject></sproject>
<ixpersonowner>2</ixpersonowner>
<spersonowner></spersonowner>
<semail></semail>
<sphone></sphone>
<finbox>true</finbox>
<ixgroup>1</ixgroup>
<itype>1</itype>
<sgroup></sgroup>

<ixproject>1</ixproject>
<sproject></sproject>
<ixpersonowner>2</ixpersonowner>
<spersonowner></spersonowner>
<semail></semail>
<sphone></sphone>
<finbox>false</finbox>
<ixgroup>1</ixgroup>
<itype>1</itype>
<sgroup></sgroup>

2.
2.
真的
1.
1.
1.
2.
假的
1.
1.
2.
2.
真的
1.
1.
1.
2.
假的
1.
1.
JQuery固有的XML解析似乎丢弃了CDATA元素的内容。FogBugz将大部分字符串数据放在CDATA标记中,因为我们允许在大多数地方使用特殊字符和标点符号。将输出封装在CDATA标记中,使我们能够相对放心地通过API发回有效数据。PHP对XML的解析工作得很好。我在网上的研究结果让一些人对此表示不满,但并没有完成多少工作。有了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发回有效数据

嗯,“相对”:如果您的数据碰巧包含“]]>,您仍然会丢失。 (*:我从未理解jQuery何时需要将文档片段创建和CSS选择压缩到同一个函数中。它们是完全不同的操作,您不想混淆,这里可能发生过这种情况。)


(**:事实上,它首先尝试使用正则表达式过滤掉jQuery自定义属性。不幸的是,由于正则表达式无法解析HTML,它会很高兴地过滤掉文本中恰巧看起来像HTML属性的有效部分。哎哟,这不是jQuery最漂亮的部分之一。)jquery现在确实有一个xml解析器,可以解决您的问题。 $.parseXML(xml)

情况发生了变化,请更新您的答案。