2015-03-21 29 views
5

Próbuję parsować XML za pomocą wywołania HTTP na zapleczu, gdzie treść jest w formacie XML. Problem polega na tym, że nie możemy używać Jquery lub DOMParser na zapleczu do parsowania. Próbowaliśmy najpierw przetworzyć go w interfejsie, a następnie wysłać jako meteorologiczną metodę (z tyłu) jako zmienną, ale był zbyt duży (przekraczał maksymalny stos). Próbowaliśmy również dodać moduł węzła, aby to zrobić, ale nie działał poprawnie.Jak parsować XML w backendorze Meteor?

Jak możemy uzyskać analizowany obiekt XML na zapleczu Meteor?

Odpowiedz

1

Próbowaliśmy dodać moduł węzła, aby to zrobić, ale nie działał poprawnie.

Być może zostałeś wyzwolony przez niezgodne zależności.

Wypróbuj node-xml2js, który wymaga tylko sax.js, który wymaga tylko JavaScript.

2

Dodaj pakiet xml2js utwórz metodę Meteor i umieścić coś w tym wnętrzu,

xml2js.parseString(xml, function (err, result) { 
    console.dir(result); 
}); 

następnie wywołać ją z klientem. Powinieneś zobaczyć swój xml spopularyzowany w jsonie w konsoli meteorytów.

10

Najpierw musisz zainstalować kilka pakietów.

  1. HTTP, więc można "GET" XML zewnętrznego
  2. xml2js, więc można analizować XML raz pokazuje się

zainstalować i zrestartować serwer tak:

meteor add http peerlibrary:xml2js && meteor 

Po drugie, zbuduj funkcję po stronie serwera. Nie musi to być metoda Meteora, ale w tym przykładzie umieściłem ją w jednym, abyśmy mogli ją łatwo uruchomić. Użyj numeru HTTP.call() or HTTP.get(), aby przesłać żądanie. Następnie URL; Mam zamiar użyć przykładowego pliku XML. Następnie parametry po adresie URL; w moim przypadku nie ma żadnych. Następnie funkcja wywołania zwrotnego.

Meteor.methods({ 
    'xmlDemo':function(){ 
     HTTP.call('GET', 
      'http://www.xmlfiles.com/examples/plant_catalog.xml', 
      {}, 
      function(callError,callResponse){ 
       console.log('xml',callResponse); 
      } 
     ); 
    } 
}); 

Jeśli jesteś nowym Meteor, zwrócić szczególną uwagę na parametr „error” najpierw w funkcji zwrotnej.

Po trzecie, wypróbuj metodę. To jest jak gra w telefon.

  1. Klient wywołuje serwer meteorów. Meteor.call('xmlDemo');
  2. Serwer meteoryczny wywołuje zewnętrzny adres URL.

Jeśli wszystko pójdzie dobrze, metoda odczytuje zawartość pliku i wyświetla dane wyjściowe na konsoli serwera. (Tj Spójrz na terminalu, gdzie run „meteor”)

{ statusCode: 200, 
content: '<?xml version="1.0" encoding="ISO8859-1" ?>\r\n<CATALOG>\r\n 
(et cetera...) 
(et cetera...) 
(et cetera...)', 
headers: 
{ 'content-type': 'text/xml', 
    'last-modified': 'Tue, 24 Apr 2012 21:06:45 GMT', 
    'accept-ranges': 'bytes', 
    etag: '"80a095275e22cd1:0"', 
    server: 'Microsoft-IIS/7.5', 
    'x-powered-by': 'ASP.NET', 
    date: 'Mon, 30 Nov 2015 19:17:26 GMT', 
    'content-length': '8167' }, 
data: null } 

Najważniejszą rzeczą jest to, że widać tu odpowiedź od HTTP.call jest obiektem. Pole "content" zawiera rzeczywiste dane. (Tutaj osobiście się potknąłem.)

Po czwarte, spróbuj przekazać ciąg znaków XML do xml2js.

Meteor.methods({ 
    'xmlDemo':function(){ 
     HTTP.call('GET', 
      'http://www.xmlfiles.com/examples/plant_catalog.xml', 
      {}, 
      function(callError,callResponse){ 
       //console.log('xml',callResponse); 
       xml2js.parseString(callResponse.content, function (jsError, jsResult) { 
        console.error('errors',jsError); 
        console.log('xml to js',jsResult); 
       }); 
      } 
     ); 
    } 
}); 

Ponownie, przy odrobinie szczęścia, zobaczysz rośliny jako obiekty wydrukowane w twoim terminalu. Teraz wystarczy wziąć tę tablicę obiektów, przepuścić ją i zapisać zawartość w kolekcji. Podkreślenia sprawia, że ​​łatwo (nie jest to wbudowane w Meteor)

_.each(jsResult.CATALOG.PLANT,function(plant){ 
    Plants.insert(plant); 
} 

Ostatni należy dodać kilka jeszcze kilka fail-sejfy do zgłaszania błędów. Również xml2js po wyjęciu z pudełka niekoniecznie będzie dobrze odtwarzać działanie kolekcji. Musisz set a few options.

  • explicitArray: false (.. Domyślnie tag jak <this>example</this> zamieni się {this:["example"]} W Mongo, który jest uważany za osadzony dokument, a będziesz mieć kłopotów)
  • emptyTag: niezdefiniowane (domyślnie pusty tag jak <this/> zamieni się {this:''}. Osobiście uważam, że łatwiej jest pozwolić pustych rzeczy nie istnieją i sprawdzić, czy istnieją czy nie, zamiast sprawdzić, czy one istnieją i faktycznie mają zawartość)

Po oczyszczeniu się niektóre własny kod, oto ostatni przykład:

na /lib/file.js ...

Plants = new Mongo.Collection('plants'); 

na /server/file.js ...

Meteor.methods({ 
    'xmlDemo':function(){ 
     HTTP.get('http://www.xmlfiles.com/examples/plant_catalog.xml',{}, 
      function(xmlError,xmlResponse){ 
       if(xmlError){ 
        console.error('xmlError',xmlError); 
       }else{ 
        xml2js.parseString(xmlResponse.content, {explicitArray:false, emptyTag:undefined}, function (jsError, jsResult) { 
        if(jsError){ 
         console.error('xml2js error',jsError); 
        }else{ 
         _.each(jsResult.CATALOG.PLANT,function(plant){ 
          Plants.insert(plant); 
         } 
        } 
       }); 
      } 
     ); 
    } 
});