目次へ

解答例 - 実習課題1 - 7.DOMと名前空間

(実習課題1)

与えられたXMLを解析するプログラムを作成しなさい。

  • 名前空間URI "http://schemas.xmlsoap.org/soap/envelope/"、ローカル名"Body"で表される要素の内容を取り出すコンソールプログラム。
  • 名前空間URI "http://schemas.xmlsoap.org/soap/envelope/"、ローカル名"Body"で表される要素は、文書中に必ず出現するものとする。Body要素はルート要素ではなく、2回以上出現しないものとする。
  • 例えば、以下のXML文書があったとします。
    <?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
    <m:customer xmlns:m="http://www.techscore.com/customerMessage/">
    <m:name>山田太郎</m:name>
    <m:age>31</m:age>
    </m:customer>
    </soapenv:Body>
    </soapenv:Envelope>
    
    出力結果は以下のようになります。
    1番目の要素: 名前空間URI:http://www.techscore.com/customerMessage/ ローカル名:customer 
    2番目の要素: 名前空間URI:http://www.techscore.com/customerMessage/ ローカル名:name 内容:山田太郎 
    3番目の要素; 名前空間URI:http://www.techscore.com/customerMessage/ ローカル名:age 内容:32
  • (ヒント)名前空間URIを取得するには、NodeのgetNamespaceURIメソッドを使用します。
  • (ヒント)ローカル名を取得するには、NodeのgetLocalNameメソッドを使用します。
  • bodyの内容には、要素とテキストのみが存在し、名前空間宣言以外の属性やコメント、エンティティは存在しないものとする。
  • body、およびその子供要素は、要素とテキストが混在するような内容を持たないものとする。つまり、body、およびその子供要素の内容は、複数の要素のみ、あるいは、テキストのみからなる。

解答例

package com.techscore.dom.chapter7.exercise1;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * NameSpaceParser.java
 * 
 * TECHSCORE Java XML DOM XSLT 7章 実習課題1
 * 
 * Copyright (c) 2004 Four-Dimensional Data, Inc.
 */

public class NameSpaceParser {

    public static void main(String[] args) throws Exception {
        System.out.println("filename is " + args[0]);

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(new File(args[0]));

        Element root = document.getDocumentElement();

        NodeList bodyList = root.getElementsByTagNameNS("http://schemas.xmlsoap.org/soap/envelope/",
                                                        "Body");

        // Body要素は1回だけ出現することを前提とする。
        parseNode(bodyList.item(0));
    }

    public static void parseNode(Node node) {
        NodeList nodeList = node.getChildNodes();
        for (int i = 0; i < nodeList.getLength(); i++) {
            printNodeData(nodeList.item(i));
            if (nodeList.item(i).getChildNodes().getLength() > 0) {
                // 再帰呼び出し
                parseNode(nodeList.item(i));
            }
        }
    }

    private static int number = 1;

    public static void printNodeData(Node node) {

        if (node.getNodeType() == Node.ELEMENT_NODE) {
            System.out.println(""); // 改行を入れる
            System.out.print((number++) + "番目の要素:" + " (名前空間)"
                    + node.getNamespaceURI() + " (ローカル名)" + node.getLocalName());
        } else if (node.getNodeType() == Node.TEXT_NODE
                && !node.getNodeValue().matches("\\s*")) {
            System.out.print(" (内容)" + node.getNodeValue());
        }
    }
}

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp