2011-06-15 17 views
28

Bir XML dosyasının sözdizimini nasıl kontrol edeceğimi anlamaya çalışıyorum, tüm etiketlerin kapalı olduğundan emin olun, rastgele karakterler bulunmuyor, vb ... Bu noktada önem verdiğim her şey Dosyada bozuk bir XML olmadığından emin olun.Java'da XML sözdizimi doğrulaması

Bunları gibi bazı SO mesajların bakarak oldum ...

... ama bende olmayan fark XML dosyasının yapısını doğrulamak istiyorum; Ben bir XML Şeması (XSD) karşı doğrulamak istemiyorum ... Sadece XML sözdizimini kontrol etmek ve doğru olup olmadığını belirlemek istiyorum.

aşağıdaki
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setValidating(false); 
factory.setNamespaceAware(true); 

DocumentBuilder builder = factory.newDocumentBuilder(); 

builder.setErrorHandler(new SimpleErrorHandler());  
// the "parse" method also validates XML, will throw an exception if misformatted 
Document document = builder.parse(new InputSource("document.xml")); 

Yukarıdaki kodda belirtilen SimpleErrorHandler sınıf olarak:

public class SimpleErrorHandler implements ErrorHandler { 
    public void warning(SAXParseException e) throws SAXException { 
     System.out.println(e.getMessage()); 
    } 

    public void error(SAXParseException e) throws SAXException { 
     System.out.println(e.getMessage()); 
    } 

    public void fatalError(SAXParseException e) throws SAXException { 
     System.out.println(e.getMessage()); 
    } 
} 

Bu bir XML belge aşağıdaki kodu kullanarak iyi biçimli ise

cevap

40

kontrol edebilirsiniz XML ile Java'yı doğrulamak için çeşitli yöntemler sağlayan this website'dan geldi. Ayrıca bu yöntemin tüm DOM ağacını belleğe yüklediğini, RAM'e kaydetmek istiyorsanız alternatifler için yorumları göreceğinizi unutmayın.

+0

Bu, XML dosyasının ** sözdizimini ** kontrol edecek mi? Burada bir XML şeması kullanmak istemiyorum ... – Hristo

+0

Evet, belgenin XML spesifikasyonları tarafından belirlenen "iyi biçimlilik" kurallarına uyduğunu kontrol edecek - http://www.w3.org/TR/xML/# sek-iyi biçimli.Bu, tüm elemanların kapalı, iç içe doğru, vb. Olması gerektiği anlamına gelir. Aslında, teknik özellik her zaman bir DTD kullanamayacağınız için iyi biçimlenmişliği tanımlar. –

+0

bunu ayrıştırır ve bu nedenle sözdizimini kontrol eder, aksi halde ayrıştırılamıyordu ... bu belgede ne yapıyorsun ki, bu – DaVinci

1

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html Bu yardımcı olur mu? Oldukça sağlam olan XSD'yi kullanır. Belge yapısını yalnızca doğrulamakla kalmaz, aynı zamanda düğümlerinizin ve özniteliklerin içerebileceği içerik türü hakkında oldukça karmaşık kurallar da sağlayabilirsiniz.

+0

XSD'yi kullanmak istemiyorum ... Başka yerlerde bu tür bir doğrulama ile ilgileniyorum. Sadece şu anda sözdizimini kontrol etmek istiyorum. – Hristo

+0

XSD'nin kullanılmasıyla ilgili sorunun ne olduğunu anlatmak ister misiniz? XSD yazmak istemiyor musun? Belgenizin hangi sürümünün uyumlu olduğunu nasıl anlarsınız? – nsfyn55

+0

Sorun yok ... XSD'ye karşı geçerli bir kod zaten var. Fakat sözdizimini kontrol etmiyor. – Hristo

3

Ne soruyorsunuz, bir içerik parçasının iyi biçimlendirilmiş bir XML belgesi olduğunu doğrulamaktır. Bu kolayca bir XML ayrıştırıcı (deneyin) söz konusu içeriği ayrıştırmak izin vererek yapılır - sorun varsa, ayrıştırıcı, bir istisna atarak bir hata bildirir. Gerçekten bunun için daha fazla bir şey yok; Yani tek ihtiyacınız olan bir XML belgesinin nasıl ayrıştırılacağını bulmaktır.

Dikkat edilmesi gereken tek şey, XML ayrıştırıcıları olduğunu iddia eden bazı lib'lerin gerçekten ayrıştırıcıların olmamasıdır, çünkü XML ayrıştırıcısının yapması gerekenleri doğrulayamayabilirler (XML belirtimine göre) - Java, Javolution, kontrol etmeyen çok az şey yapan bir örnektir; VTD-XML ve XPP3 bazı doğrulama yapar (ancak gerekli tüm kontroller). Ve spektrumun diğer ucunda, Xerces ve Woodstox spesifikasyonun gerektirdiği her şeyi kontrol eder. Xerces, JDK ile birlikte gelir; ve çoğu web hizmeti çerçevesi de Woodstox'u paketliyor.

Kabul edilen yanıt zaten bir DOM belgesine (ayrıştırma ile başlayan) içeriğin nasıl ayrıştırılacağını gösterdiğinden bu yeterli olabilir. Tek uyarı, bu, giriş belgesinin ham boyutu olarak kullanılabilen 3-5x kadar belleğinizin olmasını gerektirir. Bu sınırlamayı aşmak için Woodstox (standart Stax API'sini uygulayan) gibi bir akış ayrıştırıcısı kullanabilirsiniz. Eğer öyleyse, bir XMLStreamReader yaratır ve "reader.hasNext()" ifadesi doğru olarak döndüğü sürece "reader.next()" ifadesini çağırırsınız.

İlgili konular