2012-02-01 24 views
5

Java'da XSD kullanarak bir XML dosyası nasıl doğrulanabilir? Şemayı önceden bilmiyoruz. schemaLocation'u alabilmek, XSD'yi indirebilmek, önbelleği alıp gerçek doğrulamayı gerçekleştirebilmek istiyorum.Java'da bir XSD'ye karşı bir XML doğrula/Şemaya erişmeLinkation

Sorun şu ki, javax.xml.parsers.DocumentBuilder/DocumentBuilderFactory sınıfları ile schemaLocation'u önceden elde edemiyorum. Bunun için hile nedir? Hangi derslere bakmalıyım?

Belki kullanabileceğim daha uygun bir API var mı? Bütün sorun, (zorunlu olarak) XSD'leri yerel olarak kullanmadan dinamik olarak doğrulamamız gerektiğidir.

XSD dosyasında tanımlı olan schemaLocation URL'sini nasıl tutabiliriz?

Özellik/özellik ayarlayabileceğinizi biliyorum, ancak bu farklı bir şey. Önce XSD'den schemaLocation'u almam gerekiyor.

Lütfen tavsiye!

cevap

4

Xerces (veya JDK varsayılanı) kullandığınızı göz önünde bulundurarak, bu özelliği fabrikada true olarak ayarlamayı denediniz: http://apache.org/xml/features/validation/schema. 2 (önbelleğe alma için) http://xerces.apache.org/xerces2-j/features.html

GÜNCELLEME:

bir org.w3c.dom.ls.LSResourceResolver uygulamak ve setResourceResolver yöntemi kullanarak SchemaFactory bu set size ilgili şemalar ile oynayabilir diğer özellikleri vardır. Bu çözümleyici, şemayı önbellekten alır veya konumun nereye başvurduğu yerden alır.

GÜNCELLEME 3: (Senin için iyi bir başlangıç ​​noktası olacağını düşünüyorum)

LSResourceresolver örnek:

/** 
* Resolves resources from a base URL 
*/ 
public class URLBasedResourceResolver implements LSResourceResolver { 

private static final Logger log = LoggerFactory 
     .getLogger(URLBasedResourceResolver.class); 

private final URI base; 

private final Map<URI, String> nsmap; 

public URLBasedResourceResolver(URL base, Map<URI, String> nsmap) 
     throws URISyntaxException { 
    super(); 
    this.base = base.toURI(); 
    this.nsmap = nsmap; 
} 

@Override 
public LSInput resolveResource(String type, String namespaceURI, 
     String publicId, String systemId, String baseURI) { 
    if (log.isDebugEnabled()) { 
     String msg = String 
       .format("Resolve: type=%s, ns=%s, publicId=%s, systemId=%s, baseUri=%s.", 
         type, namespaceURI, publicId, systemId, baseURI); 
     log.debug(msg); 
    } 
    if (type.equals(XMLConstants.W3C_XML_SCHEMA_NS_URI)) { 
     if (namespaceURI != null) { 
      try { 
       URI ns = new URI(namespaceURI); 
       if (nsmap.containsKey(ns)) 
        return new MyLSInput(base.resolve(nsmap.get(ns))); 
      } catch (URISyntaxException e) { 
       // ok 
      } 
     } 
    } 
    return null; 
} 

} 

MyLSInput uygulanması gerçekten sıkıcı:

class MyLSInput implements LSInput { 

private final URI url; 

public MyLSInput(URI url) { 
    super(); 
    this.url = url; 
} 

@Override 
public Reader getCharacterStream() { 
    return null; 
} 

@Override 
public void setCharacterStream(Reader characterStream) { 

} 

@Override 
public InputStream getByteStream() { 
    return null; 
} 

@Override 
public void setByteStream(InputStream byteStream) { 

} 

@Override 
public String getStringData() { 
    return null; 
} 

@Override 
public void setStringData(String stringData) { 

} 

@Override 
public String getSystemId() { 
    return url.toASCIIString(); 
} 

@Override 
public void setSystemId(String systemId) { 
} 

@Override 
public String getPublicId() { 
    return null; 
} 

@Override 
public void setPublicId(String publicId) { 
} 

@Override 
public String getBaseURI() { 
    return null; 
} 

@Override 
public void setBaseURI(String baseURI) { 

} 

@Override 
public String getEncoding() { 
    return null; 
} 

@Override 
public void setEncoding(String encoding) { 

} 

@Override 
public boolean getCertifiedText() { 
    return false; 
} 

@Override 
public void setCertifiedText(boolean certifiedText) { 

} 

} 
+0

Dair İlk bağlantı - Ben xerces kullanıyorum: 2.10.0 JDK dışında bağımsız bir Maven bağımlılığı olarak. İkinci bağlantı çalışmıyor. Hep birlikte başka bir API kullanmıyorum. – carlspring

+0

@carlspring. Güncellemeye bakın. –

+0

Evet, bu gerçekten doğru olsa da, hala şemanın yerini bilmiyorum, bu yüzden önbelleği alamıyorum ve önbelleğe almayı gerekli kılmam gerekiyor. Bu nedenle, öncelikle 'schemaLocation' ilkesini tutmam gerekiyor. – carlspring

İlgili konular