• 締切済み

XML、DOMに関しての質問

XML、DOMに関しての質問 お世話になっております。 今回ご質問させて頂いたのは、 まず、下記のようなXMLがあった場合に 一旦全部の階層を読み込んで、そこから最下層だった場合のみ はじきたいのですが、どのようにしたらいいでしょうか? <LIST> - <FILE_LIST REQUESTPATH="\\abc\top"> - <FOLDER name="folder1" size="nonebyte" time="2009/05/12 19:13:32"> - <FOLDER name="folder1_1" size="none" time="2009/05/12 19:19:55"> <FOLDER size="none" time="2009/05/12 19:20:36">folder1_1_1</FOLDER> </FOLDER> </FOLDER> </FILE_LIST> - <FILE_LIST REQUESTPATH="\\abc\app"> - <FOLDER name="folder1" size="nonebyte" time="2009/05/12 19:13:32"> - <FOLDER name="folder1_1" size="none" time="2009/05/12 19:19:55"> <FOLDER size="none" time="2009/05/12 19:20:36">folder1_1_1</FOLDER> <FOLDER size="none" time="2009/05/12 19:19:54">folder1_1_2</FOLDER> </FOLDER> - <FOLDER name="folder1_2" size="none" time="2009/05/12 16:19:49"> <FOLDER size="none" time="2009/05/12 16:19:49">folder1_2_1</FOLDER> </FOLDER> </FOLDER> - <FOLDER name="folder2" size="nonebyte" time="2009/05/12 19:13:32"> - <FOLDER name="folder2_1" size="none" time="2009/05/12 19:19:55"> <FOLDER size="none" time="2009/05/12 19:20:36">folder2_1_1</FOLDER> <FOLDER size="none" time="2009/05/12 19:19:54">folder2_1_2</FOLDER> </FOLDER> - <FOLDER name="folder2_2" size="none" time="2009/05/12 16:19:49"> <FOLDER size="none" time="2009/05/12 16:19:49">folder2_2_1</FOLDER> </FOLDER> </FOLDER> </FILE_LIST> </LIST> 全部の階層を読み込むという部分に関しては 実装出来ているのですが、最下層だった場合 という条件が思い浮かばず 悩んでおります。 何がご教授頂ければと思います。 宜しくお願い致します。

  • XML
  • 回答数2
  • ありがとう数14

みんなの回答

  • think49
  • ベストアンサー率59% (285/482)
回答No.2

JAVAはわかりませんが、DOM API はJavaScriptと同じだと思われるので、サンプルを。(未検証です) var elements = document.getElementsByTagName('FOLDER'); for (var i=0,l=folders.length; i<l; i++) {  if (elements.item(i).childNodes.length === 1 && elements.item(i).firstChild.nodeType === elements.firstChild.TEXT_NODE) {   // 最下層の要素  } }

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

XMLのタグの階層を調べないと最下層かどうかはわかりませんね。 javaのXMLパースのsaxパースでXMLを調べるとタグの階層を知ることが可能です。 参考urlの中のsaxを利用したプログラム中のメソッド public void startElement(String name, AttributeList atts) {} ではタグ毎に呼ばれるので、ここで階層を加算して public void endElement(String namespaceURI,String localName,String qName) {} で階層を減算すればいいのです。 タグと、階層をArrayListにでも保存しておいて public void endDocument(){} でタグと階層を調べれば最下層かどうかはわかります。

参考URL:
http://www.atmarkit.co.jp/fxml/rensai/xdk03/xdk03.html
theyouth
質問者

補足

SaKaKashiさん ご回答ありがとうございます。 今回使っているのが、JavaのDOMで作成しております。 私の方で最初に表記し忘れてしまいました。申し訳ありません。 SAXが使いたかった・・・・。 DOMのAPIをずっと見ているんですが、どうにもよさそうなのが なさそうなので困っております。 参考URLもガッツリ読ませて頂きます。 ありがとうございます。

関連するQ&A

  • XML::DOM / XML::XPathでソート

    XML::DOMで効率的なソートの方法はどんなものがありますでしょうか。 一応動くものは作れたのですが、効率的とは言い難く、しかも ソート項目が一意のデータでないといけないという欠点があります。 ############################################### use XML::DOM::XPath; my $xml = <<EOM; <?xml version="1.0" encoding="UTF-8" ?> <list> <item id="10">Apple</item> <item id="5">Orange</item> <item id="20">Melon</item> </list> EOM my $parser = XML::DOM::Parser->new(); my $doc = $parser->parse( $xml ); ## <item>タグの一覧を作成 my @list = $doc->findnodes('/list/item'); ## <item>タグ id属性一覧を作成 my @idlist = map{ $_->getAttribute("id") } @list; ## id属性順にソート foreach my $id ( sort{ $a<=>$b } @idlist ){ ## id属性値を指定してノードリストを取得 my @item = $doc->findnodes('/list/item[@id='.$id.']'); ## idは一意なのでリストの先頭で固定 print $item[0]->getAttribute('id')."\n"; print $item[0]->getFirstChild->getNodeValue."\n"; } ############################################### ハッシュなら sort{ $hoe{$b} <=> $hoe{$a} } keys %hoe といった方法があるのですが、XML::DOMの場合は同じようにいきません。 良い方法がありましたらお願いします。

    • ベストアンサー
    • Perl
  • xmlファイルが生成されない

    <?php //DomDocumentを呼び出す $dom = new DomDocument('1.0','UTF-8'); //要素ノード[document]を追加 $document = $dom->appendChild($dom->createElement('document')); //新しい要素をdocumentの子要素として挿入する $document->appendChild($dom->createElement('name','名前です')); $document->appendChild($dom->createElement('text','テキストです。')); //字下げや空白を考慮してきれいに整形した出力を行う $dom->formatOutput = true; //同階層にtest.xmlとして保存 $dom->save('test.xml'); //出力 echo $dom->saveXML(); ?> のように、同じディレクトリ内にXMLファイルを生成するphpプログラムを作成してみたのですが、 ブラウザからこのPHPファイルにアクセスしてもXMLファイルが作られません。どうすれば良いのでしょうか。 なにかphp,apache等の設定をしてないからでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • xmlデータの編集について

    xmlデータの編集について ******************************************* <?xml version="1.0" encoding="UTF-8" ?> <data> <member_list> <name>メンバー1</name> <age>10歳</age> <email>aaa@a.ne.jp</email> </member_list> <member_list> <name>メンバー2</name> <age>20歳</age> <email>bbb@a.ne.jp</email> </member_list> </data> ***************************************** 上記のような"member.xml"があり、これらをフォームから入力された内容に書き換えたい場合は、どういった処理を行えばいいのでしょうか? if(isset($_POST['add'])){ $xml=simplexml_load_file("member.xml"); $addElm = $xml -> addChild("member_list"); $addElm ->addchild("name",$_POST['names']); $addElm ->addchild("age",$_POST['age']); $addElm ->addchild("email",$_POST['email']); $xml ->asXml("member.xml"); } 追加でしたら上記のような"simplexml"の"addchild"でいけるのですが、書き換える場合の処理がわかりません。 どなたか、ご教授下さいませ。

    • 締切済み
    • PHP
  • XMLでこんなの作りたい。

    [ 環境 ] OS:WindowsXP Pro PHP:5.3.1 Apache:2.2.14 DBServer:SQLServer2005 EXPRESS [ 質問 ] DB側データ row,level,level_name 0,level1,root 1,level2,admin という様なデータをXMLにて以下の様な表示にしたい。 <?xml version="1.0" encoding="UTF-8" ?> <result> <row row="0"> <level>level1</level> <level_name>root</level_name> </row> <row row="1"> <level>level2</level> <level_name>admin</level_name> </row> </result> この場合、以下のソースをどの様に変更したら良いか アドバイスを頂けたらと思います。 <?php // SQLServerとの接続 require("connect-sqlserver.php"); // XML 生成 $dom = new DOMDocument("1.0"); $node = $dom->createElement("result"); $parnode = $dom->appendChild($node); // MSSQLSERVR への接続セット $db = mssql_connect($server, $userid, $passwd); mssql_select_db($dbName, $db); // [SYSW_LEVEL]テーブルからフィールド情報取得 $query = "SELECT * FROM SYSW_LEVEL"; $res = mssql_query($query, $db); header("Content-type: text/xml"); // XMLへフィールドの値を渡す while ($row = mssql_fetch_assoc($res)) { $node = $dom->createElement("row"); $newnode = $parnode->appendChild($node); $newnode->setAttribute("level", $row['LVL_LEVEL']); $newnode->setAttribute("level_name", mb_convert_encoding($row['LVL_LEVELNAME'],'UTF-8','CP932')); } $dom->encoding="UTF-8"; echo $dom->saveXML(); ?> 以上、よろしくお願い致します。

    • 締切済み
    • PHP
  • XMLをツリー形式で表示

    下記のようなXMLをツリー形式(?)でリスト表示するにはどうすれば良いのでしょうか。 (XML) <crop>   <name>りんご</name>  <vegf>   <name>くだもの</name>  </vegf> </crop> <crop>   <name>さくらんぼ</name>  <vegf>   <name>くだもの</name>  </vegf> </crop> <crop>   <name>にんじん</name>  <vegf>   <name>やさい</name>  </vegf> </crop> <crop>   <name>かぼちゃ</name>  <vegf>   <name>やさい</name>  </vegf> </crop> ↑をこんな風↓に表示させたいです。 (リスト) ■くだもの ┣りんご ┗さくらんぼ ■やさい ┣にんじん ┗かぼちゃ $xml = simplexml_load_file("crop.xml"); foreach ($xml->crop as $crop) { echo $crop->name ; } ここまで書いてみましたが"vegfが同じものをまとめる"ことができなくて 挫折してしまいました…。 どなたかご教授ください。よろしくおねがいします。 環境はPHP Version 5.2.10です。

    • 締切済み
    • PHP
  • VBscriptでXMLデータの抽出に関する質問

    教えて下さい。以下のようなXMLファイルがあります。 <?xml version="1.0" encoding="Shift-JIS"?> <ROOT> <INFO> <NO>0001</NO> <NAME>ABC</NAME> <COMMENT> </COMMENT> <AGE>30</AGE> </INFO> </ROOT> これを以下のようにVBScriptにてデータを取り出したいです。 Dim DOM, docRoot, node, nodeList, i, m Dim objADO, objADO2 Dim objRS Dim sqlstmt, strSQL Dim no, comment 'DOMオブジェクト生成 Set DOM = CreateObject("Microsoft.XMLDOM") '同期モード DOM.async = True 'XMLを読み込む DOM.load("11.xml") 'ルートセット Set docRoot = DOM.documentElement 'ノードの設定 Set nodeList = docRoot.selectNodes("/ROOT/INFO") 'ループ For Each node In nodeList For i = 0 to node.ChildNodes.length - 1 Select case node.childNodes(i).nodeName case "NO" no = node.childNodes(i).firstChild.nodeValue case "COMMENT" comment = node.childNodes(i).firstChild.nodeValue End select Next Next ところがCOMMENTタグのようにデータが空のものがあると 「オブジェクトがありません」とエラーになります。 if Not IsNull(node.childNodes(i).firstChild.nodeValue) then というようにもやってみましたが、これでも同じエラーとなってしまいます。 何か方法はないでしょうか?アドバイスを宜しくお願いします。

    • ベストアンサー
    • XML
  • PHPでのXML操作について

    お世話になります。 PHPを少し触れる程度の初心者です。 現在PHPで既存のXMLファイルへの書き込み・削除などの編集が出来ないかと方法を探っているのですが、DOMを使うやXpathを使う、他にも色々と書かれていて少々混乱気味です。 PHP5だけで、例えば以下の様な事は可能なのでしょうか? (1) <?xml version='1.0'?> <DataSet>  <Table>   <name>○○○</name>   <auther>×××</auther>  </Table> </DataSet> というXMLファイルがあった場合、 (2) <?xml version='1.0'?> <DataSet>  <Table>   <name>○○○</name>   <auther>×××</auther>  </Table>  <Table>   <name>△△△</name>   <auther>×××</auther>  </Table> </DataSet> という様な追加。 そして再び元の(1)へ戻す様な削除です。 PHPだけでは不可能である場合、一番分かり易く簡単だと思われる方法を、どなたか分かり易くご教授願えないでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • XML文書の書き方

    すいません。まったくXMLに関して無知です。 一応基本的な書き方についてWebで調べたのですが、どうしてもわからなかったので教えて頂ければと思います。 ある場所でのイベントの時間をXMLでまとめてプログラムで出力したいのですが、 <place>  <name>渋谷</name>  <monday>  <time>0</time>  <time>1</time>  <time>2</time>  </monday>  <tuesday>  <time>0</time>  <time>6</time>  <time>12</time>  </tuesday> ・・・  <sunday>   <time>12</time>   <time>13</time>   <time>14</time> </sunday> </place> <place>  <name>新宿</name>  <monday>  <time>0</time>  <time>1</time>  <time>2</time>  </monday>  <tuesday>  <time>0</time>  <time>6</time>  <time>12</time>  </tuesday> ・・・  <sunday>   <time>12</time>   <time>13</time>   <time>14</time> </sunday> </place> のような感じで、場所と曜日と時間の紐付けをしたいのですが、このような書き方でいいのでしょうか。 プログラムのほうできちんと読み込めないので質問してみました。 もちろんプログラムが間違っている可能性もあるのですが、<time>が先頭しか読まれないようなので、こういう”いくつかわからないけどデータがある”ような場合、XMLではどのように記述すれば良いかご教授願えますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • XML
  • XML_Serializerで複数のXMLの扱い

    PHPで作成を行っています。 PEARのXML_Serializerを利用して、XMLをバースし結果を表示したいと考えています。 1つのxmlを利用するのは問題なく終わったのですが、複数のxmlをバースしたい場合の上手い方法が思い付きません。 ===↓私が思いついた方法↓==================== $xmlData = 'ttp://example.com/data1.xml'; $xmlData2 = 'ttp://example.com/data2.xml'; $class_xml_uns = &new XML_Unserializer(array('parseAttributes' => true)); $class_xml_uns->unserialize(file_get_contents($xmlData)); $res_list = $class_xml_uns->getUnserializedData(); $class_xml_uns2 = &new XML_Unserializer(array('parseAttributes' => true)); $class_xml_uns2->unserialize(file_get_contents($xmlData2)); $res_list2 = $class_xml_uns2->getUnserializedData(); 単純に2回バースするといった感じです。 何か同じ事を2回も3回も書かないといけないし、こんな事をしなくても出来るそうな気がして調べてはみたのですが、検索方法が下手なのか答えに行きつきませんでした。 ご教授とご指導のほど、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 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

専門家に質問してみよう