2015-11-30 30 views
12

ile URL'den nasıl ayrıştırılır XML ayrıştırmak için node-xml2js kullanıyorum. Bir URL'den XML ayrıştırma konusunda sorun yaşıyorum. Bu SO answer modelini kullandım. Ancak aşağıdaki kodu kullandığımda, sonuç olarak null elde ediyorum. Yanlış yaptığım şey hakkında bir fikrin var mı?Düğüm

GÜNCELLEME: Kullanılmakta olan siteye xml için URL'yi güncelledim.

var eyes = require('eyes'); 
var https = require('https'); 
var fs = require('fs'); 
var xml2js = require('xml2js'); 
var parser = new xml2js.Parser(); 

parser.addListener('end', function(result) { 
    eyes.inspect(result); 
    console.log('Done.'); 
}); 

https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml', function(result) { 
    result.on('data', function (data) { 
    parser.parseString(data); 
    }); 
    }).on('error', function(e) { 
    console.log('Got error: ' + e.message); 
}); 
+0

Yazım hatası var, '' 'var https = required ('https')' '' olmalıdır.Bunu tamir ettikten sonra benim için çalışıyor. –

+0

@Edin M Bunu işaret ettiğiniz için teşekkür ederiz. Sorun giderme işleminden sonra kopyalama/yapıştırma işleminden önce bunu düzeltmeyi unuttum. Ne yazık ki, gerçek siteye erişmeye çalışırken aynı problemle karşılaşıyorum. – Ken

+0

Son noktaya tekrar ulaşılabilir, cevabım işe yarıyor. Umarım memnuniyeti için –

cevap

16

xml2js'nin parçalarını xml ile ayrıştırabildiğini göremiyorum, dolayısıyla tüm http yanıtını arabelleğe almamız gerekiyor. Bunu yapmak için burada global kullandım, ancak concat-stream gibi bir şey kullanmak daha iyidir (bunu daha sonra göndereceğim).

Ben bunu denedim ve benim için çalışıyor: tepkisi gönderirken uçları Yalnızca

var eyes = require('eyes'); 
var https = require('https'); 
var fs = require('fs'); 
var xml2js = require('xml2js'); 
var parser = new xml2js.Parser(); 

parser.on('error', function(err) { console.log('Parser error', err); }); 

var data = ''; 
https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml', function(res) { 
    if (res.statusCode >= 200 && res.statusCode < 400) { 
     res.on('data', function(data_) { data += data_.toString(); }); 
     res.on('end', function() { 
     console.log('data', data); 
     parser.parseString(data, function(err, result) { 
      console.log('FINISHED', err, result); 
     }); 
     }); 
    } 
    }); 

, o zaman XML ayrıştırmak. xml2js, akış desteğine sahip gibi görünen ancak xml2js'un avantajından yararlanıp yararlanmadığından emin olmayan sax kullanır.

Chunk-by-chunk çözümleme (örneğinizle benzer şekilde) kullanan küçük bir örnek oluşturdum, ancak geçersiz bir xml dosyasında geldiği için ayrıştırma sırasında hata veriyor ve bu nedenle yanıtın tamamını kapatmamız gerekiyor.

xml'niz çok büyükse, akış desteğine sahip sax gibi farklı ayrıştırıcılar kullanmayı deneyin.

error işleyicisini, hatalarla karşılaştırabilmek için parser'a ekleyebilirsiniz. concat akışıyla

Concat akışı

yapabilirsiniz daha zarif concat tüm .on('data'...) çağrılar:

var https = require('https'); 
var xml2js = require('xml2js'); 
var parser = new xml2js.Parser(); 
var concat = require('concat-stream'); 

parser.on('error', function(err) { console.log('Parser error', err); }); 

https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml', function(resp) { 

    resp.on('error', function(err) { 
     console.log('Error while reading', err); 
    }); 

    resp.pipe(concat(function(buffer) { 
     var str = buffer.toString(); 
     parser.parseString(str, function(err, result) { 
     console.log('Finished parsing:', err, result); 
     }); 
    })); 

}); 

Sen (xml dosyaları büyük durumunda) tüm dosyayı tampon değil muktedir sax kullanabilirsiniz Ancak daha düşük seviyededir, ancak bir akış olarak boruları birbirine çok benzer.

+0

Kodum neden böyle bir düz xml dosyası ile çalışır herhangi bir fikir: http://www.w3schools.com/xml/note.xml? URL'yi değiştirip https'yi http olarak değiştirirsem her şey yolunda gider. – Ken

+1

Muhtemelen dosya yeterince küçüktür ve '' '.on ('veri', ...' '' bir kümede bildirilir. Daha büyük dosyalar, birden çok parça ile bildirilir. Bunun nedeni, tcp'nin bir akış protokolüdür ve temel uygulamaların verilmesidir. Bize sahip oldukları anda en kısa zamanda parçalarını ayırır.Ne zaman, ne kadar büyüklükte ve büyüklükte detaylar uygulama konularıdır –

+0

Oldukça geniş olan bir dizi başka dosya kullanacağım.Örneklerinizin her ikisi de tüm dosyayı tamponluyor mu? xml2js'nin saksafonun yararına olduğunu düşünmüştüm, bu yüzden biraz kafam karıştı. – Ken

2

xml2js'u kullanmak çok basit.

var parseString = require('xml2js').parseString; 

var xmldata = "XML output from the url"; 
console.log(xmldata); 
parseString(xmldata, function (err, result) { 
// Result contains XML data in JSON format 
}); 
+1

Kodunuzu xml pr’i görüntüleyemedim operly. – Ken

3

Sorunuza bağlı olarak, çözüm bunun gibi bir şey olmalıdır.

Her iki seçenek beklendiği gibi çalışıyor ve geçerli bir json nesnesini xml olarak veriyor. Sen

Yerli xml2js ait read.me anlatıldığı gibi xml ayrıştırmak için nasıl yapılandırabilirsiniz


var eyes = require('eyes'), 
    https = require('https'), 
    fs = require('fs'), 
    xml2js = require('xml2js'), 
    parser = new xml2js.Parser(); 


https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml', function(res) { 
    var response_data = ''; 
    res.setEncoding('utf8'); 
    res.on('data', function(chunk) { 
     response_data += chunk; 
    }); 
    res.on('end', function() { 
     parser.parseString(response_data, function(err, result) { 
      if (err) { 
       console.log('Got error: ' + err.message); 
      } else { 
       eyes.inspect(result); 
       console.log('Done.'); 
      } 
     }); 
    }); 
    res.on('error', function(err) { 
     console.log('Got error: ' + err.message); 
    }); 
}); 

ASYNC * geri arama cehennem olmadan


var eyes = require('eyes'), 
    https = require('https'), 
    async =require('async'), 
    xml2js = require('xml2js'); 

async.waterfall([ 
    function(callback) { 
     https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml', function(res) { 
      var response_data = ''; 
      res.setEncoding('utf8'); 
      res.on('data', function(chunk) { 
       response_data += chunk; 
      }); 
      res.on('end', function() { 
       callback(null, response_data) 
      }); 
      res.on('error', function(err) { 
       callback(err); 
      }); 
     }); 
    }, 
    function(xml, callback) { 
     var parser = new xml2js.Parser(); 
     parser.parseString(xml, function(err, result) { 
      if (err) { 
       callback(err); 
      } else { 
       callback(null, result); 
      } 
     }); 
    }, 
    function(json, callback) { 
     // do something usefull with the json 
     eyes.inspect(json); 
     callback(); 
    } 
], function(err, result) { 
    if (err) { 
     console.log('Got error'); 
     console.log(err); 
    } else { 
     console.log('Done.'); 
    } 
}); 
0
var https = require('https'); 
var parseString = require('xml2js').parseString; 
var xml = ''; 

function xmlToJson(url, callback) { 
    var req = https.get(url, function(res) { 
    var xml = ''; 

    res.on('data', function(chunk) { 
     xml += chunk; 
    }); 

    res.on('error', function(e) { 
     callback(e, null); 
    }); 

    res.on('timeout', function(e) { 
     callback(e, null); 
    }); 

    res.on('end', function() { 
     parseString(xml, function(err, result) { 
     callback(null, result); 
     }); 
    }); 
    }); 
} 

var url = "https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml" 

xmlToJson(url, function(err, data) { 
    if (err) { 
    // Handle this however you like 
    return console.err(err); 
    } 

    // Do whatever you want with the data here 
    // Following just pretty-prints the object 
    console.log(JSON.stringify(data, null, 2)); 
}); 
+0

Kod parçacıklarında ne yaptığınızı açıklayın. –

+0

Hey, tam açıklama burada görebilirsiniz: http://antrikshy.com/blog/fetch-xml-url-convert-to-json-nodejs/ Ben sadece temelde protokolü http için https değiştirdi orijinal sorunundan yola çıkarak url'den xml elde edilmesi. – Chris

+0

@ Chris, bağlantınızda görülebilen her şey, nerede aradığınızı bulmak için neler yapabileceğiniz hakkında bir nesneyi içeren 404 hata sayfasıdır. Bu yüzden buradaki şeyleri açıklamak daha iyi. (Bu arada, sayfa hala var (şu anda), eğik çizgi olmadan deneyin: http://antrikshy.com/blog/fetch-xml-url-convert-to-json-nodejs) – jox