2012-08-07 13 views
6

xml doğrulaması yapmaya çalışıyorum. Çalışma zamanında şemaların listesi veriliyor (muhtemelen bir kavanozda sarılıyorum). Doğrulama, SchemaFactory'ye şemaları sağladığım sıraya göre geçer veya başarısız olur. şemanın geçti kümesi şemasında ile başlamak yoksaÇalışma zamanında yükleme şemaları ile XML'yi doğrulayın, şema düzenine bağlı olarak hata oluştu

private void validateXml(String xml, List<URI> schemas){ 
     Source[] source = new StreamSource[schemas.size()]; 
     int i=0; 
     for (URI f : schemas){ 
      source[i++] = new StreamSource(f.openStream()); 
     } 

     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NA_URI); 
     sf.setResourceResolver(new MyClassPathResourceResolver()); 

     Schema schema = schemaFactory.newSchema(source); 
     Validator validator = schema.newValidator(); 
     validator.validate(new StreamSource(new ByteArrayInputStream(xml.getBytes())); 

daha, bu başarısız olduğu xml referrs kök öğesi: Burada

yapıyorum budur. Buna bir çözüm var mı, yoksa yanlış bir şey mi yapıyorum?

+0

Şemaları ve XML'yi bir yere gönderir misiniz? – davidfmatheson

+0

@davidfmatheson Maalesef bu mümkün değil, ilk şemanın gövdesinin farklı bir etiketle değiştirilmesine izin veren bir dizi şema, kök şema ve ikinci bir şema olduğunu söyleyebilirim. –

cevap

5

Xerces, aynı ad alanı için zaten bir şema belgesine sahipse, bir şema belgesini yok sayar. Bu davranış

http://apache.org/xml/features/validation/schema/handle-multiple-imports

+0

Bu bağlantıda bir HTTP 404 alıyorum, bazı ek ayrıntılar verebilir misiniz? –

+0

Ayrıca, 2 şema yüklemem gerekiyor (her biri ek şemalar içeriyor). Bunları doğru sırayla yüklersem, her şey yolunda. Aksi halde sevinç yok. İki şemada farklı hedef namluları var. –

+0

URL olarak kullanmak yerine onu aramayı deneyin. Bir URL değil JAXP seçenek adı. (Tamam, bazı tarayıcılar adres çubuğunu ve arama çubuğunu birleştirerek bunu zorlaştırır. Bunu google.com'a giderek eski yolu yapın). –

0

Öncelikle fabrika seçeneği kullanılarak değiştirilebilir, sen registerErrorHandler() yöntemini çağırarak XML okuyucuda org.xml.sax.ErrorHandler nesnesinin bir örneğini ayarlamanız gerekir. Sorunu size bildirecek uyarıları alabilirsiniz.

İkinci olarak, hangi xml kitaplığını kullandığınızı bilmelisiniz. Kodunuzda schemaFactory.getClass(). GetName() öğesini çağırın ve yazdırın. Kitaplığı tanıdığınızda, birden fazla şema içe aktarma özelliğini açma/kapama özelliğini destekliyorsa belgelerine başvurabilirsiniz.

+0

Sınıf, com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory'dir –