Pregunta

Editar: Me faltaban dos cosas aquí. La falta de & Quot; Tipo de contenido: text / xml & Quot; en el encabezado devuelto por la llamada AJAX impedía que JQuery tratara los datos devueltos como un documento. Una vez que se manejó correctamente, este código se analizó correctamente y generó solo el índice y el nombre del proyecto.

$("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);
  });
});

Original : Me estoy divirtiendo usando el API de FogBugz y JQuery para armar lo que creo que será una pequeña herramienta genial, pero me encuentro con una limitación de JQuery. Las etiquetas CDATA parecen confundirlo.

Aquí está el código que estoy usando:

  $("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);

    });
  });

Y aquí está el resultado que obtengo:

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

Parece que el análisis XML que es nativo de JQuery descarta el contenido de los elementos CDATA. FogBugz coloca la mayoría de nuestros datos de cadena en etiquetas CDATA porque permitimos caracteres especiales y signos de puntuación en la mayoría de los lugares. El encerrar la salida en etiquetas CDATA nos permite estar relativamente seguros de que estamos enviando datos válidos a través de nuestra API. El análisis PHP del XML funciona bien. Mi investigación en línea produce que algunas personas se quejen de esto, pero no hay mucho trabajo por hacer. Con la extensibilidad de JQuery, creo que hay algo por ahí. ¿Alguien más ha logrado esto?

¿Fue útil?

Solución

  

Parece que el análisis XML es nativo de JQuery

No hay un análisis XML nativo de jQuery. Simplemente utiliza la propiedad estándar XMLHttpRequest.responseXML para obtener un DOM XML para la respuesta.

  

descarta el contenido de los elementos CDATA

¿Con qué tipo de contenido está enviando la respuesta? Porque sospecho que no se está analizando como XML en absoluto. En este caso, jQuery le devolverá una cadena del documento, en lugar de un DOM XML.

Luego, cuando llame a & # 8220; $ (xml) & # 8221 ;, creará contenido del documento a partir de esa cadena (*) & # 8201; & # 8212; # 8201; analizado como HTML, no XML. En HTML no existe una sección CDATA, por lo que los navegadores pueden descartarlos o tratarlos como comentarios.

Sospecho esto porque & # 8220; project.html () & # 8221; en realidad no debería funcionar cuando el documento es XML. & # 8216; html () & # 8217; simplemente devuelve lo mismo que el estándar & # 8216; innerHTML & # 8217; propiedad (**), que solo funciona para documentos HTML; no está definido en elementos XML.

  

Incluir la salida en etiquetas CDATA nos permite estar relativamente seguros de que estamos enviando datos válidos a través de nuestra API.

Bueno, & # 8216; relativamente & # 8217 ;: si sus datos contienen & # 8220;]] > & # 8221; Aún pierdes. <! [CDATA [las secciones están pensadas como una muleta para mejorar la capacidad de escritura para la autoría manual; El XML generado por máquina realmente debería usar la codificación de entidad de la manera normal. Por lo general, la aplicación del servidor debe usar las herramientas XML adecuadas para generar la respuesta, en cuyo caso esto se hará automáticamente.

(*: nunca he entendido cuándo jQuery siente la necesidad de aplastar la creación de fragmentos de documentos y la selección de CSS en la misma función. Son operaciones completamente diferentes que no desea confundir, como puede haber sucedido aquí. )

(**: En realidad, primero trata de filtrar los atributos personalizados de jQuery, usando una expresión regular. Desafortunadamente, dado que la expresión regular no puede analizar HTML, felizmente filtrará partes válidas de su texto que parezcan atributos HTML. Whoops. No es una de las partes más bonitas de jQuery.)

Otros consejos

jquery de hecho tiene un analizador xml ahora que debería resolver su problema.     $ .parseXML (xml) http://api.jquery.com/jQuery.parseXML/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top