Normalisation dans l’parsing de DOM avec java – comment ça marche?

J’ai vu la ligne ci-dessous dans le code pour un parsingur DOM lors de ce tutoriel .

doc.getDocumentElement().normalize(); 

Pourquoi faisons-nous cette normalisation?
Je lis les docs mais je n’arrive pas à comprendre un mot.

Place tous les nœuds de texte dans toute la profondeur du sous-arbre sous ce nœud

Ok, alors quelqu’un peut-il me montrer (de préférence avec une photo) à quoi ressemble cet arbre?

Quelqu’un peut-il m’expliquer pourquoi la normalisation est nécessaire?
Que se passe-t-il si nous ne normalisons pas?

Le rest de la phrase est:

où seule la structure (par exemple, les éléments, les commentaires, les instructions de traitement, les sections CDATA et les références d’entité) sépare les nœuds de texte, c.-à-d.

Cela signifie essentiellement que l’élément XML suivant

 hello wor ld 

pourrait être représenté comme ceci dans un nœud dénormalisé:

 Element foo Text node: "" Text node: "Hello " Text node: "wor" Text node: "ld" 

Une fois normalisé, le noeud ressemblera à ceci

 Element foo Text node: "Hello world" 

Et il en va de même pour les atsortingbuts: , commentaires, etc.

En simple, la normalisation est la réduction des redondances.
Exemples de redondances:
a) des espaces en dehors des balises racine / document ( )
b) les espaces blancs dans la balise de début (< >) et la balise de fin (… >)
c) les espaces blancs entre les atsortingbuts et leurs valeurs (c.-à-d. les espaces entre le nom de la clé et = “ )
d) déclarations d’espace de nommage superflues
e) sauts de lignes / espaces dans les textes d’atsortingbuts et de balises
f) commentaires etc …

En tant qu’extension de la réponse de @JBNizet pour les utilisateurs plus techniques, voici à quoi ressemble l’implémentation de l’interface org.w3c.dom.Node dans com.sun.org.apache.xerces.internal.dom.ParentNode , qui vous donne une idée de son fonctionnement .

 public void normalize() { // No need to normalize if already normalized. if (isNormalized()) { return; } if (needsSyncChildren()) { synchronizeChildren(); } ChildNode kid; for (kid = firstChild; kid != null; kid = kid.nextSibling) { kid.normalize(); } isNormalized(true); } 

Il parcourt tous les nœuds de manière récursive et appelle kid.normalize()
Ce mécanisme est remplacé dans org.apache.xerces.dom.ElementImpl

 public void normalize() { // No need to normalize if already normalized. if (isNormalized()) { return; } if (needsSyncChildren()) { synchronizeChildren(); } ChildNode kid, next; for (kid = firstChild; kid != null; kid = next) { next = kid.nextSibling; // If kid is a text node, we need to check for one of two // conditions: // 1) There is an adjacent text node // 2) There is no adjacent text node, but kid is // an empty text node. if ( kid.getNodeType() == Node.TEXT_NODE ) { // If an adjacent text node, merge it with kid if ( next!=null && next.getNodeType() == Node.TEXT_NODE ) { ((Text)kid).appendData(next.getNodeValue()); removeChild( next ); next = kid; // Don't advance; there might be another. } else { // If kid is empty, remove it if ( kid.getNodeValue() == null || kid.getNodeValue().length() == 0 ) { removeChild( kid ); } } } // Otherwise it might be an Element, which is handled recursively else if (kid.getNodeType() == Node.ELEMENT_NODE) { kid.normalize(); } } // We must also normalize all of the atsortingbutes if ( atsortingbutes!=null ) { for( int i=0; i 

J'espère que cela vous fera gagner du temps.