2012-10-28 11 views
5

Sunucuda büyük bir xml dosyasını ayrıştırıp istemciye göndermem gerekiyor.
İsteğe bağlı ayrıştırma işlemini yapmak istiyorum - yani, yalnızca ana düğümleri ayrıştırmak ve göstermek ve istemci bir üst düğüme tıkladığında - hangi üst öğenin seçildiğini söyleyen sunucuya bir istek göndermek için daha sonra çocukları ayrıştırmak ve göndermek için (yine, tüm alt ağacı değil, sadece ebeveynleri).
STAX ayrıştırıcısı kullanmayı düşündüm, ancak ebeveyn-çocuk ilişkisi söz konusu olduğunda onunla nasıl çalışacağımı anlamıyorum. Ayrıştırıcıya, çocuk olan bir sonraki START-ELEMENT'e devam etmemesini, ancak bir sonraki üst düzey seviyeye geçmesini nasıl söylerim? ve ayrıca - ITERATOR uygulamasına geri dönmenin bir yolu var mı? Bir ebeveyn seçip çocuklarını gördükten sonra, geri dönüp önceki bir ebeveyni görebilir miyim?
Herhangi bir öneriniz için gerçekten çok memnun olurum!
Teşekkür ederiz.Stax ayrıştırma - seçilen ana babaya göre alt düğümleri ayrıştırma

+0

Sadece bazı bölümlerin dallarını almak için tam olarak simule ihtiyacım var. Ancak bu, Dom parser –

cevap

3
  1. Hayır, bir XML belgesinin alt ağacını önce ayrıştırmadan atlayamazsınız. Bu sadece her bir ayrıştırıcı için geçerli, sadece StAX için değil. (için zaten arasında elemanları ayrıştırıldı ettik ima atlamak için noktası bilmek.)

  2. Ancak her elemanın etkinliği her eleman başlangıç ​​olayı ve bir azalma ile artırmak bir iç içe geçme düzey sayacını tutularak, Hedef düzeyinizin altındaki bir seviyeden gelen tüm olayları görmezden gelmek kolaydır.

  3. Ayrıştırma bir yoldur, rastgele erişilmez, ileri geri atlayamazsınız. (Yine, bu, ayrıştırıcının şimdiye kadar ayrıştırılan her şeyin bir temsilini sakladığını varsayar, ki bu da StAX'ın kaçınmak için yarattığı şeydir.) Ancak tabiki her bir üst etiketin bayt konumunu dosyaya kaydetmeye çalışabilirsiniz. rastgele erişime açık bir dosyaya sahip olursanız araştırın. Yine de bu yaklaşım için birkaç tuzak var.

Sonuç olarak, kullanım durumunuz StAX için iyi bir uyum gibi görünmüyor. VTD-XML'u denediniz mi? Dosyanin ne kadar büyük olduğuna bağlı olarak, tam olarak istediğin gibi olabilir.

+0

üzerinden yapılabilir. Detaylı cevabınız için teşekkürler! Ancak birkaç sorum var: 1) Bir sonraki ebeveyni (kardeş) alt ağacı ayrıştırmadan arayabilirim, ama sadece okuyarak - tam ayrıştırma yapmıyorum? veya alt ağacı aşmak = ayrıştırmak mı? 2) Rastgele erişime ihtiyacım olup olmadığından emin değilim. Her seferinde belirli bir seviye göstermek istiyorum. Bir düğüme tıklarken - ilk seviyedeki çocuklarını göstermek için. Burada rastgele erişim gerekli mi? Bunun için X-Path'a ihtiyacım var mı? ve eğer yaparsam - STAX ile birleştirebilir miyim? Yoksa diğer ayrıştırıcıları aramalı mıyım? 3) VTD-XML 1GB dosyaları için iyi mi? çünkü benim sahip olduğum şey bu ... – user1579191

+0

1. Evet, ayrıştırma olarak bir alt ağaçtan gitmeyi düşündüm. Tabii ki, bu düğümler hakkında herhangi bir şey kaydetmeniz gerekmiyor (bahsettiğim derinlik sayacı dışında, tek bir global 'int'). 2. Bu, bir kullanıcı bir düğüme her tıkladığında olduğu gibi, farklı bir konumdan işlem yapmaya başlamak zorunda olduğunuzdan, etkin bir şekilde rastgele erişimdir. 3. Anlatabildiğim kadarıyla evet. Ama ben bu projeye katılmıyorum ve hiç bu kadar büyük dosyalar üzerinde kullanmayı denemedim. – biziclop

+0

Teşekkürler! son soru (umarım ...): İyi anlaşılıp anlaşılmadığını bilmek istiyorum: Stax'da - bir düğüme her tıkladığımda tüm verileri ayrıştırmak çok zaman alacak, ama diğer yandan Fazla bellek kullanmayın (Bu, herhangi bir veriyi kaydetmez mi? Yani küçük bir dosyayı veya büyük bir dosyayı ayrıştırmamın önemli olmadığı anlamına mı geliyor?). VTD-XML'de - çok fazla bellek kullanır (en azından benim durumumda çok fazla) - fakat daha sonra sadece ilk düğüme tıklandığında yavaş olacaktır (ilk ve tek seferde ayrıştırma ne zaman yapılır?) - ve sonra oldukça hızlı olacak. Sağ? Tekrar teşekkürler, gerçekten bana yardım ettin! – user1579191