2012-08-30 3 views
13

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

iはコード

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

を望んでいたとして、それはあなたが望むものに振る舞うだけノードタイプNode.TEXT_NODEでものを維持するために、あなたのノード<paragraph>の子供をフィルタリングすることです。

これは、それは意味あなたの例の中で、あなたに必要なコンテンツ

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

を返します方法の例です。

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 

それは何でありますノードのすべての子を反復し、TEXT(コメント、ノードなどを除く)とaccuそれらのそれぞれのテキスト内容を調和させる。

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

私は、Java 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"が含まれているかどうかを確認します。そうであれば、実際のノードにはテキストがありません。

このヘルプが必要です。

関連する問題