2012-08-30 22 views
13

Node.getTextContent() trả về nội dung văn bản của nút hiện hành và hậu duệ của nó.Node.getTextContent() là có một cách để có được nội dung văn bản của nút hiện tại, chứ không phải văn bản của hậu duệ

là có một cách để có được nội dung văn bản của nút hiện tại, chứ không phải văn bản của hậu duệ.

Ví dụ

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

dự kiến ​​sản lượng

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

tôi đã cố gắng mã dưới đây

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

nhưng nó mang lại kết quả như thế này

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 

lưu ý các yếu tố đoạn chứa văn bản của liên kếtthẻ mạnh mà tôi không muốn. vui lòng đề xuất một số ý tưởng?

Trả lời

11

gì bạn muốn là để lọc trẻ em của nút của bạn <paragraph> để chỉ giữ những người thân với nút loại Node.TEXT_NODE.

Đây là một ví dụ về phương pháp đó sẽ trở lại cho bạn những nội dung mong muốn

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

Trong ví dụ của bạn có nghĩa là:

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

Output:

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

Những gì nó là lặp lại trên tất cả các nút con của nút, chỉ giữ TEXT (do đó không bao gồm nhận xét, nút, v.v.) và accu mô phỏng nội dung văn bản tương ứng của chúng.

Không có phương pháp trực tiếp nào trong Node hoặc Element để chỉ lấy nội dung văn bản ở cấp độ đầu tiên.

+0

nó hoạt động, tuyệt vời và cảm ơn bạn.! – Sark

3

Nếu bạn thay đổi người cuối cùng cho vòng lặp vào một sau nó cư xử như bạn muốn

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

Tôi làm điều này với Java 8 con suối và một lớp helper:

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

Và sau đó

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

Mặc nhiên không có bất kỳ chức năng cho văn bản nút thực tế nhưng với một thủ thuật đơn giản bạn có thể làm được. Hỏi xem node.getTextContent() có chứa "\ n" không, nếu trường hợp đó xảy ra thì nút thực tế không có bất kỳ văn bản nào.

Hy vọng trợ giúp này.

Các vấn đề liên quan