2011-08-08 19 views
6

Ben aşağıda gösterildiği gibi dosyayı ayrıştırmak için JDOM ve XPath kullanarak bir XML dosyası ayrıştırır bir süreç var:Ayrıştırma hatalı biçimlendirilmiş/eksik/geçersiz XML dosyaları

private static SAXBuilder builder   = null; 
private static Document  doc   = null; 
private static XPath  xpathInstance  = null; 

builder = new SAXBuilder(); 
Text list = null; 

try { 
    doc = builder.build(new StringReader(xmldocument)); 

} catch (JDOMException e) { 
      throw new Exception(e); 
} 



try { 
    xpathInstance = XPath.newInstance("//book[author='Neal Stephenson']/title/text()"); 
    list = (Text) xpathInstance.selectSingleNode(doc); 
} catch (JDOMException e) { 
    throw new Exception(e); 
} 

yukarıda çalışıyor. Xpath ifadeleri bir özellik dosyasında saklanır, böylece bunlar her zaman değiştirilebilir. Şimdi sadece xml dosyalarını 4000 baytlık parçalara gönderecek eski bir sistemden gelen bazı xml dosyalarını işlemek zorundayım. Mevcut işlem, 4000 baytlık küme yığınlarını okur ve bunları veritabanında bir satır olarak her bir yığınla bir Oracle veritabanında depolar (Eski sistemde herhangi bir değişiklik yapmak veya parçaları veritabanında satırlar halinde depolayan işlem sorgusuzdur) .

Geçerli bir XML belgesini, belirli bir xml belgesine ilişkin tüm satırları ayıklayarak ve birleştirerek ve sonra da xml belgesini ayrıştırmak için varolan işlemleri (yukarıda gösterilen) kullanarak oluşturabilirim.

Ancak, XML belgesinden çıkarmam gereken veriler her zaman ilk 4000 baytta olacak. Bu yığın, eksik olacağından, ancak ihtiyaç duyduğum tüm verileri içereceğinden geçerli bir XML belgesi değildir. JDOM üreticisi tarafından reddedileceği için sadece bir parça ayrıştırılamıyorum.

Geçerli bir XML belgesini almak için, hatalı biçimlendirilmiş XML öbeklerini tüm parçaları birleştirmek zorunda kalmadan (oldukça fazla olabilir) ayrışıp açamayacağımı merak ediyorum. Bu bana bir yığın kullanılabilir olup olmadığını kontrol etmek için veritabanına birkaç gezi kaydedecek ve ben sadece ilk 4000 bayt kullanmak mümkün olduğu için 100'lerin parçaları birleştirmek zorunda kalmayacak.

Muhtemelen java'nın dize işlevlerini ilgili verileri ayıklamak için kullanabileceğimi biliyorum, ancak bu bir ayrıştırıcı veya xpath kullanılarak mümkün olabilir mi? ya da ikisi de xml belgesinin ayrıştırılmadan önce iyi oluşturulmuş bir belge olmasını bekliyorlar mı?

cevap

5

Geçersiz XML'yi ayrıştırmak için JSoup kullanmayı deneyebilirsiniz. Tanım olarak XML iyi biçimlendirilmiş olmalı, aksi halde geçersiz ve kullanılmamalıdır.

GÜNCELLEME - örnek:

public static void main(String[] args) { 
    for (Node node : Parser.parseFragment("<test><author name=\"Vlad\"><book name=\"SO\"/>" , 
      new Element(Tag.valueOf("p"), ""), 
      "")) { 
     print(node, 0); 
    } 
} 

public static void print(Node node, int offset) { 
    for (int i = 0; i < offset; i++) { 
     System.out.print(" "); 
    } 
    System.out.print(node.nodeName()); 
    for (Attribute attribute: node.attributes()) { 
     System.out.print(", "); 
     System.out.print(attribute.getKey() + "=" + attribute.getValue()); 
    } 
    System.out.println(); 
    for (Node child : node.childNodes()) { 
     print(child, offset + 4); 
    } 
} 
+0

teşekkürler - bu HTML belgeleri özgü olduğunu düşünüyorum. HTML ile çalışmıyorum. – ziggy

+0

@ziggy: parseFragment() öğesini deneyin! Güncellemeye bakın. – Vlad

+0

aha .. bu ilginç. Kontrol edeceğim. Teşekkürler – ziggy