¿Cómo se manejan los servicios XML en AngularJS?

Mi compañía tiene miles de servicios web xml existentes y está empezando a adoptar AngularJs para nuevos proyectos.

El tutorial en http://angularjs.org/ utiliza exclusivamente los servicios de json. Parece que hacen una llamada de servicio en el controlador, analizan el JSON resultante y pasan el objeto resultante directamente a la vista.

¿Qué hago con XML? Veo cuatro opciones:

  1. Analizar y pasar el objeto DOM directamente a la interfaz de usuario (vista).

  2. Coloque un contenedor JSON alrededor de mis servicios XML en el lado del servidor.

  3. convierta el objeto DOM a JSON con alguna biblioteca en el lado del cliente y conviértalo de nuevo cuando realice las solicitudes de publicación / publicación.

  4. Convierta el objeto DOM en un objeto JavaScript manualmente en el lado del cliente.

¿Cuál es el enfoque correcto y por qué?

Si la opción 2 es relativamente fácil para usted (como agregar conversiones JSON de una línea en los controladores back-end, por ejemplo), entonces es una buena inversión, ya que el JSON es más eficiente, mucho menos trabajo del lado del cliente y generalmente preferido por los consumidores RESTful API (en caso de que haya otros consumidores).

Habiendo hecho recientemente este tipo de trabajo, diría que la siguiente mejor ruta (si la opción 2 es difícil) sería usar respuesta y solicitar transformadores para realizar conversiones entre sus objetos XML y JavaScript, que es una variación en algún lugar entre sus opciones 3 y 4. El objeto DOMParser es un código nativo, por lo que analiza XML rápidamente. La transformación del XML DOM a objetos JavaScript y la generación de XML a partir de objetos JavaScript son algoritmos recursivos bastante sencillos. Este enfoque desacopla todo el rest de su código del lado del cliente de la representación del back-end, lo que no sería el caso si fuera con su opción 1. Tal desacoplamiento le permitiría hacer un uso directo de una interfaz RESTful basada en JSON. , en caso de que surja esa oportunidad.

La selección de cualquier opción que implique objetos JSON / JavaScript a menudo implica lidiar con problemas de desajuste de impedancia como atributos XML, colecciones XML vs. matrices JS y representación de contenido mixto XML. Si sus modelos de datos son lo suficientemente simples, o no le molesta vivir con las soluciones proporcionadas por los transformadores listos para usar entre XML y JSON (por ejemplo, contención de objetos redundantes, propiedades de texto numeradas para representar texto disjunto mezclado con elementos) , entonces esto puede no ser un problema para ti. De lo contrario, hay oportunidades para personalizar el comportamiento de transformación en cualquier extremo de la solicitud de forma imperativa (aunque lamentablemente no declarativamente, por lo que he visto).

Te recomendaría tener un convertidor de xml a json . Aqui hay uno.

https://code.google.com/p/jquery-xml2json-plugin/

Después de la conversión, tiene un objeto JS normal donde puede usar sus directivas angulares normales para analizarlas y usarlas como desee.

Yo tuve el mismo problema. Terminé haciendo un pequeño módulo para convertir todas mis respuestas XML en un objeto ng.element.

https://github.com/johngeorgewright/angular-xml

Estoy descubriendo que x2js funciona bastante bien: https://code.google.com/p/x2js/

El cliente toma el XML, sin necesidad de meterse con los servicios angulares. Una simple conversión rápida y, voila, tiene una API JSON que mimcs el documento XML. Parece que se ocupa de todos los casos de uso que me he encontrado.

HttpService un servicio llamado HttpService tiene una función llamada getRequestedContent en la que estoy usando la llamada http angular a mi servicio ” http: // localhost: 8080 / showserverstartupinfo ” que devuelve un xml de la siguiente manera:

  ######## ##########  

… y analizo el xml anterior y llene mi div con el contenido del elemento xml.

 HttpService.getRequestedContent('/showserverstartupinfo').then( function(content) { //successCallback var xml = content.data; document.getElementById('serverName').innerHTML = xml.getElementsByTagName("SERVERNAME")[0].childNodes[0].nodeValue; }, function(data) { //errorCallback }); 

La función getRequestedContent en HttpService (Angularjs) de la siguiente manera:

 getRequestedContent : function(request) { var url = this.getRootContextPath() + request; return $http({ method : 'GET', url : url, transformResponse : function(data) { return $.parseXML(data); } }); }