Quick version:
Nedir (yenilikçi herhangi bir?) Standart yakalamak nedeniyle hatalı biçimlendirilmiş dosyası XMLReader tarafından atılan hataları işleme yolu - özellikle un-kaçtı karakter. Tidy ile prepossessing (vb.) Değil bir süper cazip bir seçenek, herkes sadece kusurlu düğümünü atlamak ve doğru birlikte hareket için bir yol biliyor musun?
Descriptive Version:
Hepimiz onu düzgün oluşmuş değilse XML değil, ama dürüst olalım olduğunu biliyorum - o olur. Bir istemci düzenli mysql içine okumak gerekir masif (50-100MB +) xml dosyaları çeker. XMLReader seçimdi ve bizim ihtiyaçlarımız için iyi çalışan bir sarıcı yazdım.
Bazen, bir hata oluşur ve () ithalat öldürme başarısız oku - drat! Onun hemen her şeyi gezileri bir un-kaçan karakter (ex "&"). Çoğu durumda biz sadece müşteri veri sağlayıcısını aramak ve onların kusurlu dosyasını düzeltmek talep olurdu. Ne yazık ki veri sağlayıcıları her zaman açıkça ve / veya zamanında değil. Biz sadece hatayı yakalamak ve sağ yanındaki düğüme birlikte hareket olabilir eğer şaşırtıcı olurdu.
Ben bu bir çatlak / okuma çalışırken oldukça kısa bir süre geçirdim ve incelemeden değer bir şey bulamıyorum. Ben belirgin bir şey eksik?
This SO question umut verici görünüyordu ama onun sadece herhangi bir sonuç vermediğine. . 1 geçirmemiz kurtarmak için Reader sormalısınız gibi görünüyor, ama biz sadece, vb herhangi bir girişim / farklı hata iletileri görmüyoruz İşte yaklaşımı özetleyen ilgili kod:
$xml->open($file, null, LIBXML_NOERROR | LIBXML_NOWARNING | 1);
Ben Tidy ile preprocess her zaman olabilir, ancak daha iyi bir yolu olmalı.
Böyle tamamladı mevcut düğüm için mantık sonra bir try / catch sonraki Read () koklama gibi biraz daha "yaratıcı" yaklaşımları kabul ettik, ama o clumsy at best görünüyor. Düğümleri yoluyla hareket olur ve hata işlemeyi içerir ama ben şeyi basitleştirerek bir his var, özel / sarıcı fonksiyonu ile Read () öykünen potansiyel olabilir gibi o da görünüyor.
Yani tüm Özetle: okuduğumda () başarısız, nasıl hata yakalamak ve birlikte hareket edebilir? Herhangi bir şans biz ne hata (XMLReader atılmış olurdu en azından mesajı) geliyor görebilirsiniz?
$xml = new XMLReader();
$xml->open($file);
while ($xml->read()) {
}