6

編集:私はここで2つのことを逃していました。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の拡張性により、そこには何かがあると思います。他の誰かがこれを達成しましたか?

4

2 に答える 2

14

JQuery にネイティブな XML 解析は、

jQuery 固有の XML 解析はありません。標準の XMLHttpRequest.responseXML プロパティを使用して、応答用の XML DOM を取得するだけです。

CDATA 要素の内容を破棄します

どの Content-Type で応答を送信していますか? XMLとしてまったく解析されていないのではないかと思うからです。この場合、jQuery は XML DOM ではなく、ドキュメントの文字列を返します。

次に、「$(xml)」を呼び出すと、その文字列 (*) からドキュメント コンテンツが作成され、XML ではなくHTML として解析されます。HTML には CDATA セクションのようなものがないため、ブラウザーはそれらを破棄したり、コメントとして扱ったりする可能性があります。

ドキュメントが XML の場合、「project.html()」は実際には機能しないはずなので、これを疑っています。'html()' は、標準の 'innerHTML' プロパティ (**) と同じものを返すだけで、HTML ドキュメントに対してのみ機能します。XML 要素では未定義です。

出力を CDATA タグで囲むことで、API を介して有効なデータを送り返すことを比較的安心できます。

まあ、「相対的に」: データに「]]>」が含まれている場合でも負けです。<![CDATA[ セクションは、手書きの書きやすさを改善するための松葉杖として意図されています。機械で生成された XML は、通常の方法でエンティティ エンコーディングを使用する必要があります。通常、サーバー アプリは適切な XML ツールを使用して応答を生成する必要があります。この場合、これは自動的に行われます。

(*: jQuery が、ドキュメント フラグメントの作成と CSS の選択を同じ関数にまとめる必要性を感じているのはいつなのか、私には理解できませんでした。ここで起こったかもしれないように、それらは完全に異なる操作であり、混乱させたくないのです。)

(**: 実際には、最初に正規表現を使用して jQuery カスタム属性を除外しようとします。残念ながら、正規表現は HTML を解析できないため、たまたま HTML 属性のように見えるテキストの有効な部分を喜んで除外します。 jQuery の優れた部分です。)

于 2009-03-17T04:02:23.243 に答える
6

jqueryには、実際には、問題を解決するxmlパーサーがあります。$ .parseXML(xml) http://api.jquery.com/jQuery.parseXML/

于 2012-07-30T19:50:22.513 に答える