usar titledborder setborder definicion codigo java xml dom computer-science

titledborder - Normalización en DOM analizando con java-¿Cómo funciona?



titledborder java (3)

Vi la siguiente línea en el código para un analizador DOM en este tutorial .

doc.getDocumentElement().normalize();

¿Por qué hacemos esta normalización?
Leí los docs pero no pude entender una palabra.

Pone todos los nodos de texto en la profundidad completa del subárbol debajo de este nodo

De acuerdo, ¿puede alguien mostrarme (preferiblemente con una imagen) cómo se ve este árbol?

¿Puede alguien explicarme por qué se necesita la normalización?
¿Qué pasa si no nos normalizamos?


Como una extensión de la respuesta de @ JBNizet para usuarios más técnicos, aquí está la implementación de la interfaz org.w3c.dom.Node en com.sun.org.apache.xerces.internal.dom.ParentNode , le da una idea de cómo funciona realmente. .

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

Atraviesa todos los nodos recursivamente y llama a kid.normalize()
Este mecanismo se invalida en 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 attributes if ( attributes!=null ) { for( int i=0; i<attributes.getLength(); ++i ) { Node attr = attributes.item(i); attr.normalize(); } } // changed() will have occurred when the removeChild() was done, // so does not have to be reissued. isNormalized(true); }

Espero que esto te ahorre tiempo.


El resto de la frase es:

donde solo la estructura (por ejemplo, elementos, comentarios, instrucciones de procesamiento, secciones CDATA y referencias de entidades) separa los nodos de texto, es decir, no hay nodos de texto adyacentes ni nodos de texto vacíos.

Esto básicamente significa que el siguiente elemento XML

<foo>hello wor ld</foo>

Podría representarse así en un nodo desnormalizado:

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

Cuando se normaliza, el nodo se verá así

Element foo Text node: "Hello world"

Y lo mismo ocurre con los atributos: <foo bar="Hello world"/> , comentarios, etc.


En simple, la normalización es la reducción de redundancias.
Ejemplos de redundancias:
a) espacios en blanco fuera de las etiquetas raíz / documento ( ... <document> </document> ... )
b) espacios en blanco dentro de la etiqueta inicial (< ... >) y la etiqueta final (</ ... >)
c) espacios en blanco entre los atributos y sus valores (es decir, espacios entre el nombre de clave y = " )
d) declaraciones de espacio de nombres superfluas
e) saltos de línea / espacios en blanco en los textos de atributos y etiquetas
f) comentarios etc ...