- ベストアンサー
JavaによるXMLの読み込みの方法
- JavaでXMLを読み込む方法についての質問です。現在、JavaでXMLを読み込んで要素名を取得することはできましたが、属性名と属性の値を読み込んで表示する方法がうまくいきません。どこに何を追加すれば良いでしょうか。
- JavaでXMLの要素名を取得する方法は分かるのですが、属性名と属性の値を読み込んで表示する方法が分からなくて困っています。どのようにすれば実現できるでしょうか。
- JavaでXMLファイルを読み込んで要素名を取得する方法は理解していますが、属性名と属性の値を読み込む方法がわかりません。どのようにすれば実装できるのか、教えていただけますか。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
======Javaのソースコード============= import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*; import java.io.*; public class sample { public static void main(String[] argv){ sample a = new sample(); a.runner(); } final static String file = "sample.xml"; public void runner() { DocumentBuilderFactory factory; DocumentBuilder builder; Document doc; Node root; try { factory = DocumentBuilderFactory.newInstance(); builder = factory.newDocumentBuilder(); factory.setIgnoringElementContentWhitespace(true); factory.setIgnoringComments(true); factory.setValidating(true); factory.setNamespaceAware(true); doc = builder.parse(file) ; showNodes(doc.getDocumentElement(), " "); } catch (ParserConfigurationException e0) { System.out.println(e0.getMessage()); } catch (SAXException e1){ System.out.println(e1.getMessage()); } catch (IOException e2) { System.out.println(e2.getMessage()); } } public void showNodes(Node node, String space) { NodeList nodes = node.getChildNodes(); for (int i=0; i<nodes.getLength(); i++) { Node node1 = nodes.item(i); if (node1.getNodeType() == Node.TEXT_NODE){ continue; } switch(node1.getNodeType()){ /* 個人的にはこのほうが好き。*/ case Node.ELEMENT_NODE: /* 【キャストする!】*/ Element element = (Element)node1; /* 何故か俺の環境のJDK7では element.getLocalNameやattribute.getLocalNameがnullを返したので仕方なく。 開発版だからかな?DOM Level1扱いになっているのかな? 本当は名前空間接頭辞ではなく名前空間URIとローカル名を分けて表示したかったんだけど。 */ System.out.println("element:[" + element.getNodeName() + "]"); /* 今回は全属性を列挙したかったからこういう形を採ったけど、 特定の属性名の属性が欲しい場合は attributes.getNamedItem(String name) もっと単純に element.getAttributeNS(String namespaceURI, String localName) を使ってもいいだろう。 */ NamedNodeMap attributes = element.getAttributes(); for(int j = 0;j < attributes.getLength();j++){ /* 【ここでもキャストする!】*/ Attr attribute = (Attr)attributes.item(j); System.out.println("attribute:[" + attribute.getNodeName() + "]"); System.out.println(attribute.getNodeValue()); } break; default: break; } } } } ====================用いたXML(UTF-8,XML宣言書くの面倒だった)=========== <a> <a:b xxx="p" xmlns:a="hoge" /> <b yyy="q" /> <b zzz="r" /> </a> ======================出力結果================= element:[a:b] attribute:[xmlns:a] hoge attribute:[xxx] p element:[b] attribute:[yyy] q element:[b] attribute:[zzz] r ================ 名前空間宣言って属性ノード扱いなのか?
お礼
ありがとうございます。 これで無事欲しい情報を得られると思います。 Javaは大分初心者なのでコメント解説して頂いてとても助かりました。 他にも色々と良い勉強になりました。有難うございました<(_ _)>