2012-08-30 6 views
13

नोड.getTextContent() वर्तमान नोड और इसके वंशजों की टेक्स्ट सामग्री देता है।Node.getTextContent() वर्तमान नोड की टेक्स्ट सामग्री प्राप्त करने का कोई तरीका है, न कि वंशज का पाठ

वर्तमान नोड की टेक्स्ट सामग्री प्राप्त करने का कोई तरीका है, न कि वंशज का पाठ।

उदाहरण

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

उम्मीद उत्पादन

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

मैं कोड

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

नीचे करने की कोशिश की, लेकिन यह इस

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 
तरह उत्पादन देता है 210

टिप्पणी पैरा तत्व लिंक और मजबूत टैग का पाठ, जो मुझे नहीं चाहते हैं। कृपया कुछ विचार सुझाएं?

उत्तर

11

चाहता था क्या आप चाहते हैं कि आपके नोड <paragraph> के बच्चों फिल्टर करने के लिए केवल नोड प्रकार Node.TEXT_NODE साथ लोगों को रखने के लिए है में पाश के लिए पिछले बदलते हैं तो।

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

आउटपुट::

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

क्या यह करता है

इस विधि का एक उदाहरण है कि आप वांछित सामग्री

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

वापस आ जाएगी अपने उदाहरण के भीतर इसका मतलब है है नोड के सभी बच्चों पर फिर से चलना, केवल टेक्स्ट रखना (इस प्रकार टिप्पणियां, नोड और अन्य को छोड़कर) और accu अपनी संबंधित पाठ सामग्री mulating।

Node या Element में पहले स्तर पर केवल टेक्स्ट सामग्री प्राप्त करने के लिए कोई सीधी विधि नहीं है।

+0

यह काम कर रहा है, बढ़िया और धन्यवाद। – Sark

3

आप निम्नलिखित एक यह बर्ताव करता है के रूप में आप

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

मैं जावा के साथ ऐसा कर 8 धाराओं और एक सहायक वर्ग:

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

और फिर

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

उलझाव से वास्तविक नोड पाठ के लिए लेकिन एक सरल चाल के साथ किसी भी समारोह की जरूरत नहीं है आप कर सकते है। पूछें कि क्या node.getTextContent() में "\ n" है, यदि ऐसा है तो वास्तविक नोड में कोई टेक्स्ट नहीं है।

इस सहायता की आशा करें।

संबंधित मुद्दे

 संबंधित मुद्दे