JavaでXMLファイルを読み込み、groupノードのアトリビュートを取得する方法

このQ&Aのポイント
  • JavaでXMLファイルを読み込む方法およびgroupノードのアトリビュートを取得する方法について教えてください。
  • XMLファイルからデータを取得するためにJavaでDOMパーサーを使用しています。具体的には、groupノードのアトリビュートであるgrpIDとnumStdGrpの値を取得したいです。
  • getElementsByTagNameメソッドでは、どのbandのgroupかを区別することができません。groupノードのアトリビュートを正確に取得する方法をご教示ください。
回答を見る
  • ベストアンサー

XMLファイルの読み方

以下の様なXMLファイルがあるとします。 "groupノード(?)のアトリビュートであるgrpIDとnumStdGrpの値を取得したいです。 JavaでDOMパーサーを使うことに限定します。 <?xml version="1.0" encoding="UTF-8"?> <dataHeader <numStudent>150</numStudent> <dataMain <band name="B1"> <group grpID="1" numStdGrp="15"/> </band> <band name="B2"> <group grpID="2" numStdGrp="10"/> </band> </dataMain> </dataHeader> 自分では試して見たのは以下まで。 File fXmlFile = new File("C:\XMLファイル名"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize(); (1)numStudentとdataMainノードまでは簡単: 例) NodeList nListDM = doc.getElementsByTagName("dataMain"); 上記からnListDM.item(0)してノード取得できて、getNodeName()で名前表示する。 (2)bandノード(?)もgetElementsByTagNameで取れます。 NodeList nListBand = doc.getElementsByTagName("band"); このノードリストの長さは2です。それぞれ、アトリビュート「name」の値(B1, B2)は以下の様にして取れます。 Node nNodeBand = nListBand.item(0); Element bElement = (Element) nNodeBand; して、bElement.getAttribute("name")。 問題はこの以降。 初めに書きましたように、 groupノード(?)のアトリビュートであるgrpIDとnumStdGrpの値どうやって取得するのでしょうか? getElementsByTagName(group)はだめです。どのbandのgroupか、区別できないので。 Java+XMLに詳しい方、教えてください。 よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

> getElementsByTagName(group)はだめです。どのbandのgroupか、区別できないので。 ……はい? > Node nNodeBand = nListBand.item(0); > Element bElement = (Element) nNodeBand; の bElement が提示の XML で何を指しているのか解ってますよね? それが解っていれば getElementsByTagName(group) が bElement に使えることがわかるはずですが……。

x201s-goo
質問者

お礼

hitomuraさん ヒント、ありがとうございました。 解決しました。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

bElementの子ノードから名前が"group"のノードを探せばいいだけじゃ?

x201s-goo
質問者

お礼

wormholeさんへ アドバイスありがとうございました。

関連するQ&A

  • phpのSimpleXMLでXMLの要素を参照したい。

    フォームからキーワードを受け取り、それを、xmlを参照しながらphpで出力したいのですが、最後の最後でつまずきます。 ------------------ <?php $doc = new domDocument(); // DOMDocumentオブジェクトにより、インスタンスを生成 $doc->load("./beta.xml"); // ファイルからXML文書を読みこむ $kywd = $_REQUEST['kywd']; // フォームからデータを受け取る $nodelist = $doc->getElementsByTagName('keyword'); // 指定した要素名(keyword)の全ての要素を取得 foreach ($nodelist as $node) { // 各要素を参照 if($kywd == $node->textContent){ // もし、フォームから受け取ったデータが要素と一致したら $xurl = $node->namespaceURI; // 要素の名前空間URLを取得して$xurlに代入 $xml = simplexml_load_file("./beta.xml"); // SimpleXMLによってXMLファイルをパースし、simplexml_elementオブジェクトを作成する $parent = $xml->children("$xurl"); // 指定したノードの子ノードの配列を取得 $hairetsu = $parent[0]->children("$xurl"); //取得した配列素$hairetsuに代入 foreach($hairetsu as $key=>$value) { // ちゃんと連想配列になっているか、ためしに出力 print ($key."→".$value."<br />"); } // 連想配列になっていることを確認 print $hairetsu["title"]; // しかし、キーを指定して値を取得しようとすると、なぜか得られない。 } } ?> 問題は最後のほうです。連想配列になっていることは確かに確認できる(titleというキーも、その値もある)のですが、連想配列のキーから値を参照しようとすると、なぜか値がNULLになっていて表示できません。私は趣味でプログラミングをする程度なので、おそらく基本的なところで間違っているのだと思いますが、それがどこだか分かりません。お教え願えないでしょうか。

    • ベストアンサー
    • PHP
  • XMLの読み込み

    DocumentBuilderFactory,DocumentBuilder等を使って XMLドキュメントの読み込みを行っています。 例えば、以下の様なXMLドキュメントがあった時 <text>内の読み込みを行うと、テキストテキスト2と なってしまいます。 「テキスト<p/><p/>テキスト2」として取得したいのですが 何かいい方法ないでしょうか? ----------------------------------------- <?xml version="1.0" encoding="Shift_JIS"?> <root> <text> テキスト<p/><p/>テキスト2</text> </root> ----------------------------------------- それとも、XMLドキュメント上、「<p/>」に意味があるのでしょうか? ※プログラム一部抜粋 //-- DOMオブジェクト初期化 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); //-- XMLファイル読み込み this.doc = docBuilder.parse(new File(strPath)); this.doc.getDocumentElement().normalize();

    • ベストアンサー
    • Java
  • XML DOM XMLパーサーについて理解していません

    XMLについてイマイチ理解していないので教えてください。PHPでXMLファイルを開いて何らかの処理をするとします。例えば <?php //ドキュメントオブジェクトの作成 $doc = new DOMDocument(); //XML 文書ファイルのパース(DOM ツリーの作成) $doc->load("docs/td101.xml") //要素"b"を取得する $bElement = $doc->getElementsByTagName("b")->item(0); //取得した要素"b"に属性"ad"を設定する $bElement->setAttribute("ad","Fukuoka"); //ドキュメントをシリアライズする $doc->save("docs/result101.xml"); ?> のようにXMLファイルに属性を追加するという処理を行うとします。この時、DOMはPHPによって生成されるんでしょうか?またXMLはXMLパーサーによって解析されると本で読んだのですが、この場合PHPがXMLパーサーの機能を持っているんでしょうか?それともブラウザにXMLパーサーの機能があり、ブラウザ側で処理をされているのでしょうか?意味がわからなくて申し訳ないですが、この辺りを理解していなくて・・・御願いいたします。

    • ベストアンサー
    • XML
  • JavaによるXMLの中身の取り出し

    以下のindex.xmlのようなXML文書があるとして、Javaプログラム で<Title></Title>の中身を抜き出したいのですが、うまく取り 出せません。 【index.xml】 <?xml version='1.0' encoding='UTF-8' ?> <?xml-stylesheet type="text/xsl" href="../../../_sys/style.xsl"?> <RDF xmlns:r="○○" xmlns:d="○○" xmlns:s="○○" xmlns="○○"> <ExternalPage about="http://www.pref.iwate.jp/~hp0920/"> <d:Title><s:char code="39">'</s:char>99岩手総体</d:Title> </ExternalPage> </RDF> 【ソース】 public class Example { public static void main(String[] args) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File("index.xml")); Element root = doc.getDocumentElement(); NodeList ExternalPageLst = root.getElementsByTagName("ExternalPage"); for (int j=0; j < ExternalPageLst.getLength() ; j++) { Element ExternalPageEle = (Element)ExternalPageLst.item(j); NodeList TitleLst = ExternalPageEle.getElementsByTagName("d:Title"); for (int k=0; k < TitleLst.getLength() ; k++) { Element TitleEle = (Element)TitleLst.item(k); NodeList CharLst = ExternalPageEle.getElementsByTagName("s:char"); Element CharEle = (Element)CharLst.item(0); String Char = CharEle.getFirstChild().getNodeValue(); String Title = TitleEle.getFirstChild().getNodeValue(); System.out.println(Title); } } catch (Exception e) { e.printStackTrace(); } } } 【実行結果】 null 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • XMLファイルの読込み方法についての質問

    こんにちは、mako-kwnshと申します。 あるXMLを読み込んで指定したノード内 のデータを取り込んだ後、 指定したノードをnode型のデータに 代入したいのですが、 やり方がいまいちわかりません。 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse("c:\\Scenario\\test1.xml"); Element xmlroot = doc.getDocumentElement(); //String first = xmlroot.getNodeName(); // EMSData d3aData = new EMSData(att); // System.out.println("ddd" + d3aData.getValue(D3aCommonInfoPath.SYSTEM_KIND)); // System.out.println("ddd" + xmlroot);

    • ベストアンサー
    • Java
  • XMLのエラーコードの意味が理解出来ません

    XMLの初心者です、宜しくお願い致します。 XMLファイルをbuild.xmlによりXSLをを読み込ませていますが、 以下のようなエラーメッセジが出るのですが全く意味が理解出来ません。 何が原因でしょうか宜しくお願い致します。 __________________________ BUILD FAILED G:\xmlkhtgk\XML ??\???\workspace_070528\XMLproj\build.xml:19: Could not start xml validation: org.apache.xerces.parsers.SAXParser ________________________ 因みにxslの該当箇所(18行以下)と思われる内容は以下のようなコードです。 <xmlvalidate lenient="no" classname="org.apache.xerces.parsers.SAXParser" file="${doc.dir}/${xml.file}"> <attribute name="http://apache.org/xml/features/validation/schema" value="true" /> <attribute name="http://xml.org/sax/features/namespaces" value="true"/> <property name="http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation" value="${basedir}/${doc.dir}/${tagdef.file}"/> </xmlvalidate>

    • 締切済み
    • XML
  • XMLの名前空間について

       どなたか教えてください。 例 xml <a xmlns="test"> <b attribute="test"> <c attribute="test2"> </c> </b> </a> というxmlをMSXML4.0を参照設定している   エクセルVBAでロードし、   Dim testdom as DOMDocument Dim testNode as As IXMLDOMNode  testdom.loadXML(test.xml) set testNode = testdom.selectsinglenode("/a/b")  ノードを取得し testNode.xml を取得すると、取得したxml内に、 先頭に宣言した、xmlns="test"が自動で付加された状態 で取得されるのですが、それはいたしかたない物なのでしょうか? 名前空間の宣言なしで取得することは可能なのでしょうか? どなたか教えてください。宜しくお願いします。

  • removeChildを使っても変化なし PHP5.0

    idが条件に合ったら子ノードを削除する。という簡単なことをしたいのですが、サンプルソースをコピーして簡単なソースを作りましたが、何を変えてもエラーメッセージも出なければ、XMLファイルに変化もありません。 どなたか詳しい方削除ができない理由を教えてください。 books.xml <?xml version="1.0" ?> <data> <p><name id="1">aaaa</name><ad>1111</ad></p> <p><name id="2">bbbb</name><ad>2222</ad></p> <p><name id="3">cccc</name><ad>3333</ad></p> <p><name id="4">dddd</name><ad>4444</ad></p> <p><name id="5">eeee</name><ad>5555</ad></p> <p><name id="6">ffff</name><ad>6666</ad></p> </data> xmltest.php <?php //ドキュメントオブジェクトの作成 $doc = new DOMDocument(); //XML 文書ファイルのパース(DOM ツリーの作成) $doc->load("books.xml"); $id='3'; //DOMXPath オブジェクトの作成 $xpath = new DOMXPath($doc); //ローケーションパスの作成 $query = "/data/p[name[@id='$id']]"; //XPath を評価する 戻り値は、DOMNodeList $nodeList = $xpath->query($query); $pNode = $nodeList->item(0); //print $pNode -> textContent; //"data"要素ノードの取得 $dataElement= $doc->getElementsByTagName("data")->item(0); //print $dataElement -> textContent; //データを削除する $dataElement->removeChild($pNode); ?> これでidが3の行を消したいです

    • 締切済み
    • XML
  • javaScriptからxmlファイルを読み込みたい。

    strutsで開発を行ってるのですが、javaScriptからweb.xmlに設定してあるsession-timeoutの時間を取得したいのです。 javaScriptからxmlファイルをparseできるみたいで、ネットを参考に書いてみたのですが。うまく動きません・・・以下がソースです。 jsファイルをweb.xmlと同じ階層において試したのですが 、うまく読み込めていないようなのです。どなたかご教授お願いできないでしょうか? javaScriptからweb.xmlを読み込むことは不可能なのでしょうか? ちなみにブラウザはIE6.0以上限定です。 function readXML(){ xml_doc = new ActiveXObject("Microsoft.XMLDOM"); xml_doc.async = false; if(xml_doc.load("web.xml")){ alert("success!"); }else{ alert("error!"); } }

  • XML::XPathを使う

    エラーがでて期待する出力が出ず困っています。 ファイル名とXPathのコマンドライン引数をとり、 指定されたパスに一致するノードを出力するものです。 (参考書の写しなので、記述ミスはないと思います。) ■grabber.pl use XML::XPath; use XML::XPath::XMLParser; my $xpath = XML::XPath->new( filename => shift @ARGV ); my $nodeset = $xpath->find( shift @ARGV ); foreach my $node ( nodeset->get_nodelist ) { print XML::XPath::XMLParser::as_string( $node ) . "\n"; } コマンドラインに入力しているものは、 perl grabber.pl data.xml "/inventory/category/item/name" ■data.xml <?xml version="1.0"?> <inventory date="2001"> <category> <item id="2"> <name>aaaa</name> </item> </category> </inventory> です。 perl grabber.pl data.xml "/inventory/category/item/name" としても、下記にエラーが出ます。 Can't locate object method "get_nodelist" via package "nodeset" (perhaps you for got to load "nodeset"?) at grabber.pl line 5. いろいろ試してみたり調べたのですが、 行き詰ってしまいました。 期待する出力は"<name>aaaa</name>"なのですが・・・ どなたかこのエラーの原因がおわかりになるかた いらっしゃいますでしょうか。 環境は以下になります。 ・windowsxp ・activePerl モジュールのインストール済み ・XML-XPath ・XML-Parser 以上です。

    • ベストアンサー
    • Perl