2010-07-21 13 views
6

Bir TCP bağlantı noktasına bağlanmak için Java'yı kullandığım bir konumdayım ve XML belgelerini birbiri ardına sıralıyorum, her biri <?xml ile sınırlandırıldı belge etiketinin formatını gösteren bir örnek:Tek bir TCP akışından birden çok XML iletisini ayrıştırmak için SAX (Java) kullanma

<?xml version="1.0"?> 
<person> 
    <name>Fred Bloggs</name> 
</person> 
<?xml version="1.0"?> 
<person> 
    <name>Peter Jones</name> 
</person> 

Ben org.xml.sax.* API kullanıyorum.

import org.xml.sax.InputSource; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 
import org.xml.sax.helpers.XMLReaderFactory; 

import java.io.FileReader; 

public class XMLTest extends DefaultHandler { 

    public XMLTest() { 
    super(); 
    } 

    public static void main(String[] args) throws Exception { 
    XMLReader xr = XMLReaderFactory.createXMLReader(); 

    XMLTest handler = new XMLTest(); 
    xr.setContentHandler(handler); 
    xr.setErrorHandler(handler); 

    xr.parse(new InputSource(new Socket("127.0.0.1", 4555).getInputStream())); 
    } 
} 

: Aşağıdaki iskelet sınıf kullanıyorum kurulum gösteren

Exception in thread "main" org.xml.sax.SAXParseException: The processing instruction 
target matching "[xX][mM][lL]" is not allowed. 

: ikinci belgenin başında genelinde geldiğinde SAX ayrıştırma ilk belge için mükemmel çalışıyor ancak bir istisna atar Xml'nin formatı üzerinde herhangi bir kontrolüm yok (bu bir finansal veri feed'i), ancak verimli bir şekilde ayrıştırmak ve tüm belgeleri ayrıştırmak zorundayım. Öğleden sonraları/akşamları farklı şeyler denedim ama hiçbiri sonuç vermedi. Herhangi bir yardım büyük takdir edilecektir.

+0

Her bir ayrı belge için ayrıştırma yapmalısınız, yani '

+0

Bu gibi bir şey yapmam gerekti ve sadece kendime (burada) (http://stackoverflow.com/questions/6711766/multiple-xml-files-in-one-stream/) kendi Reader'ında her şeyi sarmadım Daha kolay kullanım için –

cevap

6

Akışı her <?xml version="1.0"?> üzerinde bölmek ve hepsini ayrı ayrı çözümlemek istersiniz. BufferedReader bu konuda yardımcı olabilir. Açılış örneği:

reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); 
StringBuilder builder = null; 
for (String line; (line = reader.readLine()) != null;) { 
    if (line.startsWith("<?xml")) { 
     if (builder != null) { 
      xr.parse(new InputSource(builder.toString())); 
     } 
     builder = new StringBuilder(); 
    } 
    builder.append(line); 
} 
+0

Bunu yaparken "input", InputStream input = new Socket ("127.0.0.1", 4500) .getInputStream(); "Aşağıdaki özel durumu alırsınız: " main "java.io dizisinde istisna .FileNotFoundException:/Users/admin/IdeaProjects/XMLTest/ (FileInputStream.java:106) . (FileInputStream.java:66) Görünüşe göre xr.parse() bir InputSource olarak sarılmış olsa bile dizeleri beğenmez. – jkt

+0

Yığınları yorumlayabileceğinizi düşünüyor musunuz? FileNotFoundException'ın bununla nasıl bir ilişki içinde olduğunu göremiyorum. Diyelim ki, senin sorunun başka bir yerde, belki ayrışmanın ötesinde. Dosya adı verilen istisna mesajında ​​'/ Users/admin/IdeaProjects/XMLTest/<' aslında geçerli bir btw görünmüyor. Stacktrace'i tekrar okutun, koddaki doğru yere geri dönün, bu da izdeki satır numaralarını temel alarak buna neden oldu, kök nedenini kırdı ve düzeltdi. Eğer atıyorsanız ve bu problem gerçekten de bu soruyla ilgili değilse, yeni bir soru sorun (örn. "XML dosyası nasıl kaydedilir?"). – BalusC

+0

Hey, Yığınları okuyabilirim - Sadece ilk birkaç satırı yapıştırdım. Kodumun stacktrace işaretçisi 'XMLTest.main (XMLTest.java:42)' dır ve satır 42 şudur: 'xr.parse (yeni InputSource (builder.toString()));' (yukarıdaki örneğinizden olan) . Bununla ilgili yardımın için teşekkür ederim. – jkt

İlgili konular