2008-10-23 14 views
6

Estoy tratando de leer un archivo para producir un documento DOM, pero el archivo tiene espacios en blanco y líneas nuevas y estoy tratando de ignorarlos, pero no pude t:Cómo ignorar los espacios en blanco mientras se lee un archivo para producir un DOM XML

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

que veo en Javadoc ese método setIgnoringElementContentWhitespace funciona solamente cuando la bandera de validación está permitido, pero no tengo la DTD o esquema XML para el documento.

¿Qué puedo hacer?

actualización

no me gusta la idea de presentarme <! ELEMENT ... declaraciones y he probado la solución propuesta en el forum señalado por Tomalak, pero no funciona, tengo usó Java 1.6 en un entorno Linux. Creo que si se propone no más voy a hacer un par de métodos de hacer caso omiso de los nodos de texto de espacio en blanco

Respuesta

9

'IgnoringElementContentWhitespace' no se trata de la eliminación de todos nodos de texto puro, espacios en blanco, sólo los nodos de espacio en blanco cuyos padres están descritas en el esquema como tener Contenido de ELEMENT, es decir, solo contienen otros elementos y nunca texto.

Si no tiene un esquema (DTD o XSD) en uso, el contenido del elemento está predeterminado 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 hasta donde yo sé, los que están disponibles para Java no).

Podría piratear el documento en el camino hacia el analizador para incluir la información del esquema, por ejemplo, agregando un subconjunto interno a la declaración <! DOCTYPE ... [...]> que contiene <! ELEMENT ...> declaraciones, 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 usando un LSParserFilter.

+0

fin he ignorar espacios en blanco mediante programación, como usted sugiere en el párrafo – Telcontar

5

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

A continuación, envuelve todas sus NodeList s en esta clase y los 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 la ventaja adicional de poder usarse en un bucle for-each.

+0

Las Esto no funciona, ya que ¡también ignora el ** espacio ** de espacio en blanco en nodos reales! – Strinder

+0

@Strinder Sé que no puede comentar (lo siento), pero quería hacerle saber que tenía la intención de ignorar cualquier 'nodo' que fuera solo espacio en blanco. En mi aplicación, nunca habría espacios en blanco significativos en mi xml. – jjnguy

+0

Tengo espacios en blanco por una simple razón: Como difiero partes de XML, no puedo proporcionar un XSD, lo que significa que no puedo distinguir entre el espacio ENTRE nodos y el espacio como contenido dentro de los nodos. Sin embargo, simplemente ignoro esos nodos ahora (con la conciencia de que la diferencia es de alguna manera "incompleta"). – Strinder

2

hice funciona al hacer esto

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

Prueba esto:

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

    } 
Cuestiones relacionadas