Forum Programmation.java XMLConfiguration et validation DTD.

Posté par  .
Étiquettes : aucune
0
12
sept.
2008
Bonjour,
Je suis confronté à un souci très bloquant pour parser un XML de configuration.
J'utilise les commons-configuration 1.2 de Apache et donc la classe XMLConfiguration.
Seulement voilà, mon XML contient un chemin vers un DTD sur le net, et bien que j'aie désactivé la validation, il cherche quand même à récupérer le DTD sur le net.
Comme je suis sur un intranet, je n'ai pas d'accès à l'extérieur et je tombe dans un timeout de la connexion.
Y a-t-il un moyen de réellement forcer la validation à ne pas tourner ?
C'est franchement énervant d'avoir une méthode pour désactiver la validation... et de constater que cela le fait quand même ! Car selon la doc, si le XML contient la balise doctype avec chemin du DTD, le parser tentera quand même de prendre le DTD pour valider.

J'ai vaguement vu qu'on pouvait tenter des choses avec le DocumentBuilder et EntityResolver, mais j'ai pas trop trouvé de choses, et je n'ai pas non plus trop le temps de jouer à expérimenter des workarounds.

Quelqu'un aurait une solution ?? Merci de vos réponses !
  • # une idée comme ça

    Posté par  . Évalué à 1.

    Salut,

    ça vaut ce que ça vaut : récupérer la DTD et lui indiquer le chemin en local dans le DOCTYPE.
    Workaround pas beau, mais peut-être utile en attendant.
    • [^] # Re: une idée comme ça

      Posté par  . Évalué à 1.

      Oui, j'y avais pensé, sauf que l'URL du DTD ne renvoie pas un DTD valide !!
      Et de plus, je n'ai pas besoin de DTD pour valider ce XML, je veux juste le parser le plus simplement possible.
      Sinon, mettre un DTD bidon en local c'est aussi une idée, mais je ne veux pas m'embêter à modifier le XML.

      Par contre, j'ai trouvé un workaround avec le DocumentBuilder.

      xml = new XMLConfiguration();
      xml.setFile(xmlOut);
      DocumentBuilder db = null;
      final class RmEntityResolver implements EntityResolver {
      public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
      byte[] buffer = null;
      buffer = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\">".getBytes();
      ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
      return new InputSource(bais);
      }
      }
      db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
      EntityResolver er = new RmEntityResolver();
      db.setEntityResolver(er);
      xml.setDocumentBuilder(db);
      //xml.setValidating(false);
      xml.load();


      Et du coup je n'ai plus besoin de mon setValidating(false).

      Mais cette facon de faire n'est pas la plus propre je pense...

      (quelqu'un sait comment afficher les indentations dans une balise <code> ?)
      • [^] # Re: une idée comme ça

        Posté par  . Évalué à 2.

        Et de plus, je n'ai pas besoin de DTD pour valider ce XML, je veux juste le parser le plus simplement possible.

        Si tu n'a pas besoin de DTD, ne met pas de DTD.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.