Najpierw musisz zainstalować kilka pakietów.
- HTTP, więc można "GET" XML zewnętrznego
- 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.
- Klient wywołuje serwer meteorów.
Meteor.call('xmlDemo');
- 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);
}
}
});
}
);
}
});