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