【问题标题】:Parsing XML with CDATA with JQuery使用 JQuery 使用 CDATA 解析 XML
【发布时间】:2009-03-16 21:08:24
【问题描述】:

编辑:我在这里遗漏了两件事。 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);

    });
  });

这是我得到的输出:

<?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>

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

【问题讨论】:

    标签: jquery xml parsing fogbugz fogbugz-on-demand


    【解决方案1】:

    似乎 JQuery 原生的 XML 解析

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

    丢弃 CDATA 元素的内容

    您使用什么 Content-Type 发送响应?因为我怀疑它根本没有被解析为 XML。在这种情况下,jQuery 会将文档的字符串传回给您,而不是 XML DOM。

    然后,当您调用“$(xml)”时,它将从该字符串(*)创建文档内容 — 解析为 HTML,不是 XML。在 HTML 中没有 CDATA 部分这样的东西,因此浏览器可能会丢弃它们,或者将它们视为 cmets。

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

    将输出包含在 CDATA 标记中可以让我们相对放心,我们正在通过我们的 API 发回有效数据。

    好吧,“相对”:如果您的数据恰好包含“]]>”,您仍然会输。

    (*: 我从来不明白 jQuery 什么时候觉得需要将文档片段创建和 CSS 选择压缩到同一个函数中。它们是完全不同的操作,你不想混淆,就像这里可能发生的那样。 )

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

    【讨论】:

    【解决方案2】:

    jquery 现在确实有一个 xml 解析器,它应该可以解决您的问题。 $.parseXML(xml) http://api.jquery.com/jQuery.parseXML/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      相关资源
      最近更新 更多