
現在、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 + " ");
}
}
}
}
No.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は大分初心者なのでコメント解説して頂いてとても助かりました。
他にも色々と良い勉強になりました。有難うございました<(_ _)>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java final 1 2022/06/10 22:49
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
現在時刻をYYYY-MM-DDThh:mm:ss...
-
privateなフィールドは継承され...
-
インタフェイス実装と抽象クラ...
-
バッチファイルごしのシステム...
-
パッケージ化されたクラスより...
-
変数を動的に利用するには?
-
SJC-Pの問題で分からない部分が...
-
Javaの問題集の解答が意味不明です
-
コンストラクタの引数の中のnew?
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
-
ループ処理の際、最後だけ","を...
-
動的配列が存在(要素が有る)か...
-
Java int sum = 0は必要ですか?
-
VBAで配列の計算
-
ORA-01858: 数値を指定する箇所...
-
java キーボード入力された値の...
-
Javaでデータに登録する度にID...
-
toString()メソッドについて
-
flush()とclose()について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数を動的に利用するには?
-
中カッコ{}だけの記述について
-
プログラミングの問題です。大...
-
初心者なので教えてほしいです。
-
Javaでlog4jを使ってログ出力を...
-
コンストラクタの引数の中のnew?
-
System.exit()の値を取得したい
-
JSP/Servletのパラメータの受け...
-
GetterとSetterをやったのに。
-
javaで処理のやり方がわかりま...
-
オーバーロードで
-
Timerについて教えて下さい
-
NoSuchMethodErrorが解決できま...
-
インタフェイス実装と抽象クラ...
-
randomで
-
C# DatagridviewにExcelシート...
-
javaのプログラミングで作るRPG...
-
所持金の計算式とその表示の仕方
-
【java】同ディレクトリ別ファ...
-
多次元配列の出力のところがわ...
おすすめ情報