2012-08-30 18 views
13

Node.getTextContent() devuelve el contenido de texto del nodo actual y sus descendientes.Node.getTextContent() hay una forma de obtener contenido de texto del nodo actual, no el texto del descendiente

hay una manera de obtener el contenido de texto del nodo actual, no el texto del descendiente.

Ejemplo

<paragraph> 
    <link>XML</link> 
    is a 
    <strong>browser based XML editor</strong> 
    editor allows users to edit XML data in an intuitive word processor. 
</paragraph> 

esperado salida

paragraph = is a editor allows users to edit XML data in an intuitive word processor. 
link = XML 
strong = browser based XML editor 

i trataron a continuación código

String str =   "<paragraph>"+ 
          "<link>XML</link>"+ 
          " is a "+ 
          "<strong>browser based XML editor</strong>"+ 
          "editor allows users to edit XML data in an intuitive word processor."+ 
         "</paragraph>"; 

     org.w3c.dom.Document domDoc = null; 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder; 

     try { 
      docBuilder = docFactory.newDocumentBuilder(); 
      ByteArrayInputStream bis = new ByteArrayInputStream(str.getBytes()); 
      domDoc = docBuilder.parse(bis);   
     } catch (ParserConfigurationException e1) {   
      e1.printStackTrace(); 
     } catch (SAXException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }  

     DocumentTraversal traversal = (DocumentTraversal) domDoc; 
     NodeIterator iterator = traversal.createNodeIterator(
       domDoc.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true); 

     for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) {   
      String tagname = ((Element) n).getTagName(); 
      System.out.println(tagname + "=" + ((Element)n).getTextContent()); 
     } 

pero da salida como esta

paragraph=XML is a browser based XML editoreditor allows users to edit XML data in an intuitive word processor. 
link=XML 
strong=browser based XML editor 

nota del elemento párrafo contiene el texto del enlace y fuerte etiqueta, que no quiero. por favor sugiera algunas ideas?

Respuesta

11

Lo que se quiere es filtrar los niños de su nodo <paragraph> sólo para entretener a los más con el nodo Tipo Node.TEXT_NODE.

Este es un ejemplo de método que le devuelva el contenido deseado

public static String getFirstLevelTextContent(Node node) { 
    NodeList list = node.getChildNodes(); 
    StringBuilder textContent = new StringBuilder(); 
    for (int i = 0; i < list.getLength(); ++i) { 
     Node child = list.item(i); 
     if (child.getNodeType() == Node.TEXT_NODE) 
      textContent.append(child.getTextContent()); 
    } 
    return textContent.toString(); 
} 

Dentro de su ejemplo que significa:

String str = "<paragraph>" + // 
     "<link>XML</link>" + // 
     " is a " + // 
     "<strong>browser based XML editor</strong>" + // 
     "editor allows users to edit XML data in an intuitive word processor." + // 
     "</paragraph>"; 
Document domDoc = null; 
try { 
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
    ByteArrayInputStream bis = new ByteArrayInputStream(str.getBytes()); 
    domDoc = docBuilder.parse(bis); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
DocumentTraversal traversal = (DocumentTraversal) domDoc; 
NodeIterator iterator = traversal.createNodeIterator(domDoc.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true); 
for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) { 
    String tagname = ((Element) n).getTagName(); 
    System.out.println(tagname + "=" + getFirstLevelTextContent(n)); 
} 

Salida:

paragraph= is a editor allows users to edit XML data in an intuitive word processor. 
link=XML 
strong=browser based XML editor 

lo que hace es iterando en todos los hijos de un nodo, guardando solo TEXTO (excluyendo comentarios, nodo, etc.) y accu mulando su contenido de texto respectivo.

No hay un método directo en Node o Element para obtener solo el contenido de texto en el primer nivel.

+0

está funcionando, genial y gracias.! – Sark

3

Si cambia el último bucle en el siguiente se comporta como lo hubiera querido

for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) {   
    String tagname = ((Element) n).getTagName(); 
    StringBuilder content = new StringBuilder(); 
    NodeList children = n.getChildNodes(); 
    for(int i=0; i<children.getLength(); i++) { 
     Node child = children.item(i); 
     if(child.getNodeName().equals("#text")) 
      content.append(child.getTextContent()); 
    } 
    System.out.println(tagname + "=" + content); 
} 
1

hago esto con Java 8 arroyos y una clase de ayuda:

import java.util.*; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class NodeLists 
{ 
    /** converts a NodeList to java.util.List of Node */ 
    static List<Node> list(NodeList nodeList) 
    { 
     List<Node> list = new ArrayList<>(); 
     for(int i=0;i<nodeList.getLength();i++) {list.add(nodeList.item(i));} 
     return list; 
    } 
} 

Y luego

NodeLists.list(node) 
.filter(node->node.getNodeType()==Node.TEXT_NODE) 
.map(Node::getTextContent) 
.reduce("",(s,t)->s+t); 
0

Implícitamente no tienen ninguna función para el texto del nodo actual, sino con un simple truco que lo puede hacer. Pregunte si node.getTextContent() contiene "\ n", si ese es el caso, entonces el nodo real no tiene ningún texto.

Espero que esta ayuda.

Cuestiones relacionadas