Esta es una de esas clases como diría LM de copiar y pegar. Lo cierto es que no me ha costado mucho hacerla pero como no he encontrado nada por ahí quiero compartirla. Se trata de una clase para imprimir nodos de la clase javax.imageio.metadata.IIOMetadataNode y es que es una de las que más me ha gustado para intentar reproducir el comportamiento del JS en HTML. Con dicha clase, creamos nodos, añadimos hijos, atributos pero… ¿Y si lo queremos sacar en un String? Pues ahí deja algo que desear y por eso comparto la clase:
import javax.imageio.metadata.IIOMetadataNode;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.NodeList;
public class Node {
public static String toString(IIOMetadataNode node) {
StringBuilder sb;
NodeList nl;
//
int i = 0;
sb = new StringBuilder();
nl = node.getChildNodes();
if (nl.getLength() == 0) {
sb.append(getString(node));
} else {
sb.append(getParent(node));
sb.append(">");
if (node.getUserObject() != null && (Boolean) node.getUserObject() && node.getTextContent()!= null) {
sb.append(node.getTextContent());
}
while (i < nl.getLength()) {
sb.append(toString((IIOMetadataNode)nl.item(i)));
i++;
}
if ((node.getUserObject() == null || !(Boolean) node.getUserObject()) && node.getTextContent()!= null) {
sb.append(node.getTextContent());
}
sb.append(getEndParent(node));
}
return sb.toString();
}
private static String getString (IIOMetadataNode node) {
StringBuilder sb;
NamedNodeMap nm;
int i = 0;
sb = new StringBuilder();
nm = node.getAttributes();
sb.append("<");
sb.append(node.getNodeName());
while (i < nm.getLength()) {
sb.append(" ");
sb.append(nm.item(i).getNodeName());
sb.append("=\"");
sb.append(nm.item(i).getNodeValue());
sb.append("\"");
i++;
}
if (node.getTextContent()!= null) {
sb.append(">");
sb.append(node.getTextContent());
sb.append("</");
sb.append(node.getNodeName());
sb.append(">");
} else {
sb.append("/>");
}
return sb.toString();
}
private static String getParent (IIOMetadataNode node) {
StringBuilder sb;
NamedNodeMap nm;
int i = 0;
sb = new StringBuilder();
nm = node.getAttributes();
sb.append("<");
sb.append(node.getNodeName());
while (i < nm.getLength()) {
sb.append(" ");
sb.append(nm.item(i).getNodeName());
sb.append("=\"");
sb.append(nm.item(i).getNodeValue());
sb.append("\"");
i++;
}
return sb.toString();
}
private static String getEndParent (IIOMetadataNode node) {
StringBuilder sb;
sb = new StringBuilder();
if (node.getTextContent()!= null || node.getChildNodes().getLength() != 0) {
sb.append("</");
sb.append(node.getNodeName());
sb.append(">");
} else {
sb.append("/>");
}
return sb.toString();
}
}
Y con un ejemplo de prueba:
public void prueba () {
IIOMetadataNode node;
node = new IIOMetadataNode("br");
node.setTextContent("esto es el texto");
node.setAttribute("class", "pp");
node.setAttribute("id", "1");
node.setUserObject(false);
IIOMetadataNode node2;
node2 = new IIOMetadataNode("a");
node2.setTextContent("esto es el texto");
node2.setAttribute("class", "pp");
node2.setAttribute("id", "1");
node.appendChild(node2);
node2 = new IIOMetadataNode("a");
node2.setAttribute("class", "pp");
node2.setAttribute("id", "2");
node.appendChild(node2);
System.out.println(Node.toString(node));
}
Genera algo como:
<br class="pp" id="1"><a class="pp" id="1">esto es el texto</a><a class="pp" id="2"/>esto es el texto</br>
NOTA: he usado el método setUserObject para determinar si el texto del nodo va antes o después de sus hijos (por defecto después), pero si lo cambiamos a true obtendremos algo como:
<br class="pp" id="1">esto es el texto<a class="pp" id="1">esto es el texto</a><a class="pp" id="2"/></br>
¿Alguien quiere identar el código? Jejej. Quizá sea matar bombas a cañonazos, pero no hay que añadir librerías y es rápido J

Deja un comentario