要素名を指定してテキストノードを読みこむ



要素名を指定してその要素が持つテキストノードを抽出することが出来ます。。

/**
  * Select  XML text  by tag  name. 
  * This program  read  XML file  "Mailtest1.xml"  on current directory.
*/
import java.io.*;
import javax.xml.parsers.*;
import  org.w3c.dom.*;

public class ExamDomByTagName  {
    Document  doc;
    String  fileNameStr   =  "Mailtest1.xml";

    public static void main(String[] args) {
        ExamDomByTagName  dbtn  =  new  ExamDomByTagName();
        System.out.println(dbtn.getXmlText("subject"));
    }

    ExamDomByTagName()  {
        try {
            DocumentBuilderFactory  docbFact   = DocumentBuilderFactory.newInstance();
            DocumentBuilder  docBuilder  =  docbFact.newDocumentBuilder();
            doc   =  docBuilder.parse(new File(fileNameStr));
        }  catch(Exception  e)  {
            e.printStackTrace();
            System.exit(1);
        }
    }

    public  String  getXmlText(String  tag_name)   {
        String  ret_str  = "";
        //  Getting  root  element
        Element  root_element   =  doc.getDocumentElement();
 
        //  Getting  all  node list  of  this element
        NodeList  nl  =  root_element.getElementsByTagName(tag_name);
        Node  node   =  nl.item(0);
         //"Text" node  is chiled  of "Element" node.
        if(node  !=  null)  {
            if (node.getFirstChild() !=  null)  {
                // node type  equals "Text"
                ret_str  =  node.getFirstChild().getNodeValue();
            }  else{
                System.out.println("text  is not found.");
            }
        } else {
            System.out.println("node  if  not  found.");
        } 
        
        return  ret_str;
    }
}



<読込ファイルの内容>
<?xml version="1.0" encoding="Shift-JIS" ?>
<!--- Mailtest1.xml -->
<MailDocument>
<subject>Test Mail Subject</subject>
<attach>
<file>
</file>
</attach>
<body>
HelloJavaMail
second line
</body>
</MailDocument>

<実行結果>

Test Mail Subject
 


コンソール画面に"Test Mail Subject"と表示されます。


<getDocumentElement method>
DocumentクラスのgetDocumentElementメソッドで、ルート要素を入手しています。

<getElementsByTagName method>
ElementクラスのgetElementsByTagNameメソッドでタグの要素名を指定し、指定した要素ノードに含まれているノードリストを入手しています。
ここでは要素名として"subject"を指定しています。

 <item method>
NodeListからノードを入手するメソッドです。
NodeListオブジェクトに格納されている個々のノードは、0(zero)から始まるインデックスで扱います。
itemメソッドの引数に0を設定しているので、最初のノードにアクセスしています。
ここで入手したノードをSystem.out.printlnすると"<subject>Test Mail Subject</subject>"と出力されます。

<getFirstChild method>
要素ノード<subject>の子要素であるテキストノードオブジェクトを入手しています。

<getNodeValue method>
テキストノードから文字列を取得するメソッドです。

<注>
このプログラムは、読み込むXMLの構造が上記の構造になっていることを前提に作られています。
つまり、要素ノード<subject>の最初の子要素はテキストノードであって、子要素としてさらに要素ノードが存在する構造には対応していません。


<上記のXML文書の階層構造>
ルートノード 子ノード さらにその子ノード さらにその子ノード
MailDocument(要素ノード、文書) subject(要素ノード) Test Mail Subject(テキストノード)
attach file
body HelloJavaMail(テキストノード)
second line
要素ノード
テキストノード