XMLドキュメントをプログラムで解析する際、各ノードが要素(Element)、テキスト(Text)、コメント(Comment)、属性(Attribute)などどのタイプに該当するかを正確に判別することは、構文解析やデータ抽出の精度向上に不可欠です。Java標準のDOM APIでは、Nodeインターフェースに定義された定数とgetNodeType()メソッドを用いることで、ノードの種別を確実に判定できます。
DOMによるノード型判定の基本手順
以下の例では、example.xmlを読み込み、再帰的に全ノードを走査し、その種類と名前を出力します。
1. XMLドキュメントのパース
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true); // 名前空間対応を有効化
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new FileInputStream("example.xml"));
2. ルート要素の取得とノード走査開始
Element rootElement = doc.getDocumentElement();
System.out.println("ルート要素: " + rootElement.getTagName());
traverseNode(rootElement);
3. 再帰的ノード分類処理(カスタマイズ済みロジック)
private static void traverseNode(Node node) {
int type = node.getNodeType();
switch (type) {
case Node.ELEMENT_NODE:
System.out.printf("【要素】%s%n", node.getNodeName());
break;
case Node.TEXT_NODE:
String textContent = node.getTextContent().trim();
if (!textContent.isEmpty()) {
System.out.printf("【テキスト】'%s'%n", textContent);
}
break;
case Node.COMMENT_NODE:
System.out.printf("【コメント】%s%n", node.getNodeValue());
break;
case Node.ATTRIBUTE_NODE:
Attr attr = (Attr) node;
System.out.printf("【属性】%s='%s'%n", attr.getName(), attr.getValue());
break;
case Node.DOCUMENT_NODE:
System.out.println("【ドキュメント】");
break;
case Node.PROCESSING_INSTRUCTION_NODE:
System.out.printf("【処理命令】%s %s%n", node.getNodeName(), node.getNodeValue());
break;
default:
System.out.printf("【その他】ノードタイプID: %d%n", type);
}
// 子ノードがあれば再帰呼び出し
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
traverseNode(children.item(i));
}
}
4. 主要ノードタイプ一覧(DOM Level 3準拠)
Node.ELEMENT_NODE→ <tag>...Node.TEXT_NODE→ タグ間の文字列(空白含む)Node.COMMENT_NODE→ <!-- ... -->Node.ATTRIBUTE_NODE→ 要素の属性(attr="value")Node.DOCUMENT_NODE→ ドキュメント全体のルートコンテナNode.PROCESSING_INSTRUCTION_NODE→ <?xml version="1.0"?>
なお、Node型のインスタンスは、実行時にその実際のサブクラス(Element, Text, Commentなど)にキャスト可能であり、型安全な操作にはinstanceofによるチェックも併用可能です。