重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

現在、JavaでXMLを読みたく色々なサイト様を参考にさせて頂き
プログラムを作成しております。

その結果、下記のようなプログラムで要素名を取得することは出来たのですが、
「属性名」と「属性の値」を読み込み表示することが中々上手くいきません。

どこに何を追加したらよいでしょうか。宜しければ教えて下さい。

-- sample.java -- sample.xml --------------------------------------
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;
Node root;
try {
factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
factory.setIgnoringElementContentWhitespace(true);
factory.setIgnoringComments(true);
factory.setValidating(true);
root = builder.parse(file);
showNodes(root, " ");
} 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 node2 = nodes.item(i);
if(!node2.getNodeName().equals("#text")){
System.out.println(space + "<" + node2.getNodeName() + ">");
showNodes(node2, space + " ");
}
}
}
}

A 回答 (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
================
名前空間宣言って属性ノード扱いなのか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
これで無事欲しい情報を得られると思います。
Javaは大分初心者なのでコメント解説して頂いてとても助かりました。
他にも色々と良い勉強になりました。有難うございました<(_ _)>

お礼日時:2010/01/07 13:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!