jquery - 使用 JQuery 使用 CDATA 解析 XML

标签 jquery xml parsing fogbugz fogbugz-on-demand

编辑:我在这里漏掉了两件事。 AJAX 调用返回的 header 中缺少“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 的可扩展性,我会认为那里有一些东西。还有其他人做到了吗?

最佳答案

It would seem that the XML parsing that's native to JQuery

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

discards the contents of CDATA elements

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

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

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

Enclosing the output in CDATA tags allows us to rest relatively assured that we're sending back valid data via our API.

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

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

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

关于jquery - 使用 JQuery 使用 CDATA 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/652159/

相关文章:

java - XML 架构 : Setting fixed value for an attribute defined in a base-type

c - 用C语言解析单词;翻译程序

c# - 如何使用window.open在mvc中的jquery中的同一窗口中打开 Controller 操作?

javascript - 悬停 td 从悬停 tr 中逃脱背景颜色变化

java - 如何使用 Java 从 XML 中读取值并将其保存在 Hashmap 中

android - xml解析终止

java - 内修复表达式计算 - NoSuchElementFound 异常

javascript - 在两个 child 之间添加一个 DOM 元素

javascript - jQueryUI 滑动效果 - Divs 堆叠

java - 使用 SAX 字符方法从 XML 元素解析 PCDATA