JavaでXMLノードの種類を識別する方法

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によるチェックも併用可能です。

タグ: Java XML dom documentbuilder xml-parsing

5月16日 04:24 投稿