解答例 - 実習課題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());
        }
    }
}
  
![Webアプリ開発エンジニアのための技術情報サイト[テックスコア]](/common/img/description.gif) 
 







