La solution pourrait être d'utiliser un DefaultHandler VDispatch qui délègue en interne les événements SAX au DefaultHandler V1, V2 ou V3 approprié.
In startElement
VDispatch recherche le début d'un sous-arbre pertinent. Selon les sous-arbres XSD, il choisit le gestionnaire correspondant V1, V2 ou V3.
À l'intérieur du sous-arbre, il transmet tous les événements au gestionnaire choisi.
En dehors du sous-arbre, il ignore tous les événements.
public class VDispatch extends DefaultHandler {
private DefaultHandler current_;
private int subtreeLevel_;
public void startElement(String uri, String localName, String qName, Attributes attributes) {
if ((current_ == null) && (subtree-is-starting)) {
current_ = select-handler-based-on-xsd;
subtreeLevel_ = 0;
}
if (current_ != null) {
current_.startElement(uri, localName, qName, attributes);
subtreeLevel_++;
}
}
public void endElement(String uri, String localName, String qName) {
if (current_ != null) {
current_.endElement(uri, localName, qName);
if (--subtreeLevel_ == 0)
current_ = null;
}
}
// simple forwarding in all other DefaultHandler methods
public void characters(char[] ch, int start, int length) {
if (current_ != null)
current_.characters(ch, start, length);
}
}
sont vos VxParsers SAX ContentHandlers? – wero
Pas tout à fait, ils sont DefaultHandler. – calaedo
quelle profondeur avez-vous de jeter un coup d'oeil dans le XML pour décider quel analyseur prendre? Le XSD est-il défini dans l'élément racine? – wero