parseo manage leer java xml whitespace

manage - parseo de xml en java



Cómo ignorar espacios en blanco mientras lee un archivo para producir un DOM XML (3)

''IgnoringElementContentWhitespace'' no se trata de eliminar todos los nodos de texto en blanco puro, solo los nodos de espacio en blanco cuyos padres se describen en el esquema como que tienen contenido ELEMENT, es decir, solo contienen otros elementos y nunca texto.

Si no tiene un esquema (DTD o XSD) en uso, el contenido del elemento se establece por defecto en MIXED, por lo que este parámetro nunca tendrá ningún efecto. (A menos que el analizador proporcione una extensión DOM no estándar para tratar todos los elementos desconocidos que contengan contenido ELEMENT, que por lo que yo sé, los que están disponibles para Java no).

Puede piratear el documento en el camino en el analizador para incluir la información del esquema, por ejemplo, agregando un subconjunto interno a la declaración <! DOCTYPE ... [...]> que contiene las declaraciones <! ELEMENT ...>, luego use el parámetro IgnoringElementContentWhitespace.

O, posiblemente, sea más fácil, podría quitar los nodos de espacio en blanco, ya sea en un proceso posterior, o cuando entren utilizando un LSParserFilter.

Intento leer un archivo para producir un documento DOM, pero el archivo tiene espacios en blanco y líneas nuevas e intento ignorarlos, pero no pude:

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

Veo en Javadoc que el método setIgnoringElementContentWhitespace opera solo cuando el indicador de validación está habilitado, pero no tengo el esquema DTD o XML para el documento.

¿Que puedo hacer?

Actualizar

No me gusta la idea de presentar declaraciones de mySelf <! ELEMENT ... y he intentado con la solución propuesta en el foro apuntado por Tomalak, pero no funciona, he usado java 1.6 en un entorno Linux. Creo que si no se propone más, haré algunos métodos para ignorar los nodos de texto en espacio en blanco


Esta es una respuesta (realmente) tardía, pero así es como lo resolví. Escribí mi propia implementación de una clase NodeList . Simplemente ignora los nodos de texto que están vacíos. El código sigue:

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

Luego envuelve todos sus NodeList en esta clase e ignorará efectivamente todos los nodos de espacio en blanco. (Que defino como Nodos de Texto con texto recortado de 0 de longitud)

También tiene el beneficio adicional de poder usarse en un bucle for-each.


Hice que funcione haciendo esto

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