解答例 - 実習課題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());
}
}
}

