Jak obsługiwać usługi XML w AngularJS?

Moja firma ma tysiące istniejących usług internetowych xml i zaczyna przyjmować AngularJs dla nowych projektów.

The tutorial over at http://angularjs.org / korzysta wyłącznie z usług json. Wygląda na to, że wykonują wywołanie usługi w kontrolerze, analizują wynikowy JSON i przekazują wynikowy obiekt bezpośrednio do widoku.

Co zrobić z XML? Widzę Cztery opcje:

  1. Przetworzyć i przekazać obiekt DOM bezpośrednio do UI (widok).

  2. Umieść wrapper JSON wokół moich usług XML po stronie serwera.

  3. Przekonwertuj obiekt DOM na JSON z jakąś biblioteką po stronie klienta i przekonwertuj go z powrotem, gdy wykonam żądania post/put.

  4. Ręcznie przekonwertuj obiekt DOM na obiekt JavaScript po stronie klienta.

Jakie właściwe podejście i dlaczego?

Author: T J, 2013-03-19

5 answers

Jeśli Opcja 2 jest dla Ciebie stosunkowo łatwa (np. dodanie jednowierszowych konwersji JSON w kontrolerach back-endowych), to prawdopodobnie jest to dobra inwestycja, ponieważ JSON jest szczuplejszy nad drutem, znacznie mniej pracy po stronie klienta i ogólnie preferowany przez konsumentów RESTful API (w przypadku, gdy są inni konsumenci).

Wykonując ostatnio tego typu prace, powiedziałbym, że następną najlepszą ścieżką (jeśli opcja 2 jest trudna) byłoby użycie odpowiedzi i prośby transformers do wykonania konwersje między obiektami XML i JavaScript, co jest wariacją gdzieś pomiędzy opcjami 3 i 4. Obiekt DOMParser jest kodem natywnym, więc parsuje XML bardzo szybko. Przekształcanie XML DOM do obiektów JavaScript i generowanie XML z obiektów JavaScript to dość proste algorytmy rekurencyjne. Takie podejście oddziela całą resztę kodu po stronie klienta od reprezentacji zaplecza, co nie miałoby miejsca, gdybyś wybrał opcję 1. Takie odsprzęganie umożliwiłoby bezpośrednie korzystanie z interfejsu RESTful opartego na JSON, gdyby nadarzyła się taka możliwość.

Wybranie dowolnej opcji, która obejmuje obiekty JSON / JavaScript, często wiąże się z problemami niedopasowania impedancji, takimi jak atrybuty XML, Kolekcje XML vs.tablice JS i reprezentacja zawartości mieszanej XML. Jeśli twoje modele danych są wystarczająco proste lub nie masz nic przeciwko temu, aby żyć z rozwiązaniami dostarczanymi przez gotowe transformatory między XML i JSON (np. redundantne zabezpieczenie obiektu, numerowane właściwości tekstu reprezentujące wspólny tekst zmieszany z elementami), to może nie być problemem dla ciebie. W przeciwnym razie istnieje możliwość dostosowania zachowania transformacji na każdym końcu żądania imperatywnie(choć niestety nie deklaratywnie, o ile widziałem).

 34
Author: Jollymorphic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-19 05:39:58

Polecam mieć Konwerter XML do json. Tu jest jeden.

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

Po konwersji, masz normalny obiekt JS, w którym możesz użyć swoich normalnych dyrektyw kątowych, aby je przeanalizować i użyć ich tak, jak chcesz.

 16
Author: Abilash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-19 10:15:49

Miałem ten sam problem. Skończyło się na zrobieniu małego modułu, aby włączyć wszystkie moje odpowiedzi XML w ng.element obiektu.

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

 16
Author: johngeorgewright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-03 22:52:43

Uważam, że x2js działa całkiem nieźle: https://code.google.com/p/x2js/

Klient pobiera XML, nie ma potrzeby bałaganu z usługami angular. Prosta szybka konwersja i, voila, masz JSON API, który mimcs dokument XML. Wygląda na to, że zajmuje się wszystkimi przypadkami, na które wpadłem.

 11
Author: Michael Bushe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-03 20:07:10

Stworzyłem serwis o nazwie HttpService posiadający funkcję o nazwie getRequestedContent w której używam angular http call to my service " http://localhost:8080/showserverstartupinfo " który zwraca xml w następujący sposób:

<SERVERSTARTUPINFO>
<SERVERNAME>########</SERVERNAME>
<SERVERSTARTUPTIME>##########</SERVERSTARTUPTIME>
</SERVERSTARTUPINFO>

...i analizuję powyższy xml i wypełniam mój div zawartością elementu 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
});

GetRequestedContent funkcja w HttpService (Angularjs) w następujący sposób:

getRequestedContent : function(request) {
  var url = this.getRootContextPath() + request;
  return $http({
    method : 'GET',
    url : url,
    transformResponse : function(data) {
      return $.parseXML(data);
    }
  });
}
 0
Author: Rohit luthra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-08 11:24:15