2015-07-29 2 views
0

Comment puis-je implémenter un modèle de stratégie sur SAX basé sur la définition XSD?Modèle de stratégie Java SAX basé sur la valeur XSD

like: 
if xsd = V1 use V1Parser 
if xsd = V2 use V2Parser 
if xsd = V3 use V3Parser 
else error 

Le problème est que je dois jeter un regard dans le XML de savoir qui XSD est défini, mais je ne suis pas en mesure de changer plus Parser (et je ne commencerai pas à nouveau parce que le xsd ne se définit pas à la début/pas bien formaté XML du système ERM).

Connaissez-vous une solution de contournement?

+0

sont vos VxParsers SAX ContentHandlers? – wero

+0

Pas tout à fait, ils sont DefaultHandler. – calaedo

+0

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

Répondre

1

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); 
    } 
} 
+0

Merci pour la solution propre! – calaedo