要素名を指定してテキストノードを読みこむ
要素名を指定してその要素が持つテキストノードを抽出することが出来ます。。
/**
* 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" ?> |
<実行結果> 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 |
|||
| 要素ノード | ||||
| テキストノード | ||||