2010-08-05 19 views
7

Şu anda SAX kullanarak internetten veri alan bir uygulama geliştiriyorum. Google Weather API gibi basit XML dosyalarını ayrıştırmak için daha önce kullandım. Bununla birlikte, ilgilendiğim web siteleri bir sonraki seviyeye ayrıştırmaktır. Sayfa çok büyük ve dağınık görünüyor. Sadece bazı belirli satırları almam gerek; gerisi benim için uygun değil.
Bu gereksiz satırları/etiketleri atlamak mümkün mü yoksa adım adım mı gitmem gerekiyor?SAX ayrıştırıcısını kullanarak büyük XML dosyalarını ayrıştırma (bazı satırları/etiketleri atla)

+0

de çürütücü

Kontrol dışarı ben genişletilmiş VTD-xml bir Lot Thaks SAX çok daha iyi bir hafıza verimli bir şekilde rastgele erişime veya apache çürütücü –

cevap

1

Evet, atlayabilirsiniz. Sadece istediğiniz etiketi tanımlayın ve sadece bu etiket değerlerini getirin.

+0

ile xml erişmesini sağlar düşünüyorum, cevabın beni uzun kurtaracak kod satırları! – Amine

1

Xml'nizi ayrıştırmak için sahnenin arkasında SAX kullanacak XPath kullanmayı deneyebilirsiniz. Buradaki dezavantaj, Xpath değerlendirme yönteminin her çağrısında XML'in ayrıştırılacağıdır. Daha sonra DOM çözümleyici SAX parser..SAX ayrıştırıcı çok daha hızlıdır

+0

Cevabınız için teşekkürler Bu olasılığı göreceğim! – Amine

1

Sen

+0

SAX ayrıştırma DOM'den çok daha hızlıdır. DOM ayrıca, tüm belgenin belleğe alınmasını gerektirir. –

+0

Cevabınız için çok teşekkürler, yardımlarınız için gerçekten minnettarım, DOM'u kullanmaya çalışacağım ve hangi çıktıları aldığımı göreceğim! – Amine

2

Evet sadece etiketleri yok, bunu yapabilir .. Eğer büyük XML dosyalarını ayrıştırmak istiyorsanız yararlıdır özel etiketleri okumak istiyorum Eğer ilgilenmiyor. Ama ilginç parçaları alma için ayrıştırılabilir XML belgesi ve XPath oluşturmak için TagSoup bir kombinasyonunu deneyebilirsiniz

public startElement(String uri, String localName, 
    String qName, Attributes attributes) { 
    if(localName.equals("myInterestingTag") { 
    // do your thing.... 
    } 
} 

public void endElement(String uri, String localName, String qName) { 
    if(localName.equals("myInterestingTag") { 
    // do your thing.... 
    } 
} 

public void characters(char[] ch, int start, int length) { 
    // if parsing myinteresting tag... do some stuff. 
} 
+0

Teşekkürler, ben genellikle böyle yaparım;)! – Amine

1

tüm belge bu (DefaultHandler impl) göre ayrıştırılır zorunda unutmayın .

+0

Teşekkürler DaDaDom cevabınız için size en kısa zamanda bakacağım! – Amine

+0

ne yazık ki xpath kullanmak o kadar kolay değil – Janusz

1

atlamak için SAX kullanarak bir strateji için de benzer bir soruya cevabım/etiketleri yok Bakınız: Bu XMLReader üzerine ContentHandlers anahtarlama içerir

Skipping nodes with sax

. XML belgesinin bir portunu okurken, atlamak istediğinizde, sadece bir ContentHandler içinde, olaylarla hiçbir şey yapmadan değiştiriniz. Göz ardı edilecek bölümün sonuna ulaşıldığında, XML içeriğini işlemek için kullandığınız içerik işleyicisine geri denetimden geçirir.

+0

Cevabınız kesinlikle benim hedefe ulaşmanıza yardımcı olacak!çok teşekkürler -Cheers – Amine

4

Commons-digester'ı severim. Belirli etiketlere karşı kurallar belirlemenizi sağlar. Kural, yalnızca etiketle karşılaştığında yürütülür.

Digester sax üzerinde inşa edilmiştir ve bu nedenle tüm sax özelliklerine ve belirli etiketlerin seçici olarak ayrıştırılması için gerekli olan özgüllüğe sahiptir. Ayrıca, karşılık gelen etiketle karşılaşıldığında ve öğe bittiğinde yeni öğelerle itilen bir yığını kullanır.

Tüm yapılandırma dosyalarımı ayrıştırmak için kullanıyorum. http://commons.apache.org/digester/

+0

Çok teşekkürler Raja, Bu çözüme bakacağım !! – Amine