2008-10-23 7 views
6

J'essaie de lire un fichier pour produire un document DOM, mais le fichier a des espaces et des retours à la ligne et j'essaie de les ignorer, mais je ne peux pas t:Comment ignorer les espaces lors de la lecture d'un fichier XML DOM

DocumentBuilderFactory docfactory=DocumentBuilderFactory.newInstance(); 
docfactory.setIgnoringElementContentWhitespace(true); 

Je vois dans Javadoc cette méthode setIgnoringElementContentWhitespace ne fonctionne que lorsque le drapeau de validation est activé, mais je ne la DTD ou schéma XML pour le document.

Que puis-je faire?

Mise à jour

Je n'aime pas l'idée de me présenter <! ELEMENT ... déclarations et j'ai essayé la solution proposée dans le forum pointé par Tomalak, mais il ne fonctionne pas, j'ai Java utilisé 1.6 dans un environnement Linux. Je pense que si plus est proposé, je vais faire quelques méthodes pour ignorer les nœuds de texte contenant des espaces

Répondre

9

« IgnoringElementContentWhitespace » est pas sur la suppression tous nœuds de texte pur-blancs, seuls noeuds blancs dont les parents sont décrits dans le schéma comme ayant ELEMENT contenu - c'est-à-dire, ils ne contiennent que d'autres éléments et jamais de texte.

Si vous n'avez pas de schéma (DTD ou XSD) en cours d'utilisation, le contenu de l'élément est par défaut MIXED, donc ce paramètre n'aura aucun effet. (À moins que l'analyseur ne fournisse une extension DOM non standard pour traiter tous les éléments inconnus comme contenant du contenu ELEMENT, ce qui n'est pas le cas pour Java.)

Vous pouvez pirater le document en cours de route. parser pour inclure les informations du schéma, par exemple en ajoutant un sous-ensemble interne à la déclaration <! DOCTYPE ... [> déclaration contenant les déclarations <! ELEMENT ...>, puis utilisez le paramètre IgnoringElementContentWhitespace. Ou, peut-être plus facilement, vous pouvez simplement supprimer les nœuds d'espaces blancs, soit dans un post-traitement, soit à mesure qu'ils arrivent à l'aide d'un LSParserFilter.

+0

J'ai finalement d'ignorer les espaces blancs programatically, comme vous suggérez au paragraphe las – Telcontar

5

Ceci est une réponse (vraiment) en retard, mais voici comment je l'ai résolu. J'ai écrit ma propre implémentation d'une classe NodeList. Il ignore simplement les nœuds de texte vides. Code suit:

private static class NdLst implements NodeList, Iterable<Node> { 

    private List<Node> nodes; 

    public NdLst(NodeList list) { 
     nodes = new ArrayList<Node>(); 
     for (int i = 0; i < list.getLength(); i++) { 
      if (!isWhitespaceNode(list.item(i))) { 
       nodes.add(list.item(i)); 
      } 
     } 
    } 

    @Override 
    public Node item(int index) { 
     return nodes.get(index); 
    } 

    @Override 
    public int getLength() { 
     return nodes.size(); 
    } 

    private static boolean isWhitespaceNode(Node n) { 
     if (n.getNodeType() == Node.TEXT_NODE) { 
      String val = n.getNodeValue(); 
      return val.trim().length() == 0; 
     } else { 
      return false; 
     } 
    } 

    @Override 
    public Iterator<Node> iterator() { 
     return nodes.iterator(); 
    } 
} 

Vous Enveloppez ensuite tous vos NodeList s dans cette classe et il ignorera efficacement tous les nœuds blancs. (Ce que je définis comme des nœuds de texte avec 0-longueur de texte rogné.)

Il a également l'avantage de pouvoir être utilisé dans une boucle pour chaque.

+0

Cela ne fonctionne pas comme ignore également les espaces ** contenu ** dans les nœuds réels! – Strinder

+0

@Strinder Je sais que vous ne pouvez pas commenter (désolé à ce sujet), mais je voulais vous faire savoir que j'avais l'intention d'ignorer tout «nœud» qui était seulement un espace blanc. Dans mon application, il n'y aurait jamais d'espace significatif dans mon XML. – jjnguy

+0

J'ai des espaces pour une raison simple: Puisque je diff parties de XML, je ne peux pas fournir un XSD - ce qui signifie que je ne peux pas faire de différence entre les nœuds et l'espace comme contenu dans les nœuds! Cependant, je ne fais qu'ignorer ces nœuds maintenant (sachant que le différentiel est en quelque sorte «incomplet»). – Strinder

2

je l'ai fait en faisant cela fonctionne

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     dbFactory.setIgnoringElementContentWhitespace(true); 
     dbFactory.setSchema(schema); 
     dbFactory.setNamespaceAware(true); 
NodeList nodeList = element.getElementsByTagNameNS("*", "associate"); 
0

Essayez ceci:

private static Document prepareXML(String param) throws ParserConfigurationException, SAXException, IOException { 

     param = param.replaceAll(">\\s+<", "><").trim(); 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setIgnoringElementContentWhitespace(true); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     InputSource in = new InputSource(new StringReader(param)); 
     return builder.parse(in); 

    }