同じタグ名の項目取得方法

このQ&Aのポイント
  • XMLファイルにおいて、同じタグ名の項目を取得する方法を解説します。
  • XMLファイルには、同じタグ名が複数存在する場合があります。そのような場合でも、特定の条件に合致する項目を取得することが可能です。
  • C++のDOMを使用する場合、タグ名が同じである複数のNodeListを取得するには、条件判定を行う必要があります。条件に合致する項目のみを取得することができます。
回答を見る
  • ベストアンサー

同じタグ名の項目取得

初めて質問させていただきます。 よろしくお願い致します。 XMLについて勉強を始めたばかりで、基本的な質問です。 <住所録> <個人> <住所>東京都</住所> <氏名>○○</氏名> </個人> <個人> <住所>千葉県</住所> <氏名>××</氏名> </個人> </住所録> 上のように、住所と氏名の個人データが住所録として 登録されているようなXMLでは、タグ名が<個人><住所><氏名>と、同じものになってしまいます。 このようにタグ名が同じXMLファイルにアクセスして「<個人>というタグ名からその配下のNodeListを取得」するようなプログラムを作るとき、(言語はC++でDOMを使用します) <住所>東京都</住所> <氏名>○○</氏名> <住所>千葉県</住所> <氏名>××</氏名> と、2つのNodeListを取得するにはどうすればいいのですか? (この場合、タグ名が同じで、個人情報が2つですが、xmlではこの2つの個人情報の「”氏名○○”のリストのみ取得する」というように、Nodeを判定し条件にあった項目を取得することは可能ですか??) よろしくお願い致します。

  • chase
  • お礼率50% (1/2)
  • XML
  • 回答数2
  • ありがとう数6

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

  • ベストアンサー
  • MetalKing
  • ベストアンサー率57% (15/26)
回答No.2

「条件付でNodeListは取得できない」ではなく 「NodeListを取得するのに条件を与えられない」です。 こういった処理を望むのであれば、自分で処理を記述しなければならないということです。 childNodesプロパティで得られる情報は、当該ノードの子、全てをコレクションとして含むNodeListということになります。 「”氏名○○”のリストのみ取得する」という処理をしたいのであれば、『childNodesプロパティを使用して<個人>ノードを全て取得した後、さらに<氏名>ノードを取得して判断』という流れになるでのしょう。 この件に関して言えば、ネームスペースは『自分で判断する』必要があります。

chase
質問者

お礼

お礼が遅くなり,申し訳ございません。 childNodesプロパティを使うのですね。ありがとうございます。 今、MSXMLパーサ4.0でDOMを使ってVC6.0で質問で挙げたようなxmlファイル操作のプログラムを作成しています。 COMプログラミングでの文法が難しく、childNodesでのノードの取りかたが分かりません・・・。 今、getTagNameで上のxmlファイルだと、<住所>を指定して最初の <住所>東京都</住所> しか取れません。<住所>千葉県</住所>も取るにはどうすればいいのでしょうか・・・別途新しい質問を立てたほうがいいのかも知れませんが、是非よろしくお願い致します。

その他の回答 (1)

  • MetalKing
  • ベストアンサー率57% (15/26)
回答No.1

NodeListを取得するにはchildNodesプロパティが使えます。 条件付でNodeListを取得する方法は標準では提供されていないようです。MicrosoftのパーサだとSelectNodesというメソッドが提供されていますが...。

chase
質問者

補足

迅速な回答、ありがとうございました。 条件付でNodeListは取得できない・・・ということでしょうか・・・ まだ勉強不足で完全には理解していないのですが、「名前空間」を使って、タグ名がかぶっていても欲しいリストだけ拾ってくる・・・ということはできないですか??

関連するQ&A

  • 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
  • XMLタグ情報取得

    PHPにxmlファイルのタグ情報を利用するシステムを構築したいのですが、調べてもよく解らなかったため質問させて頂きます。 PHPは勉強経験があるため解るのですがXMLはまったくの初心者です。 システムは以下の流れです。 システムA(PHP) <?php  $i;  if($iがシステムBで使用されているか確認){   使用されている場合$iで処理  }else{   使用されていない場合xmlファイルからタグ情報取得   for($iの親タグ<B>を取得){    if(<$i><$j><$k>のどれかがシステムBで使用されていないか?){     $jが使用されていた場合、システムAの$iと、システムBの$jは同じ使用用途のデータと判断し処理    }   }  } xmlファイル <?xml version="1.0" encoding="EUC-JP"?> <A> <B> <$i></$i><$j></$j><$k></$k> </B> </A> このようなシステムを構築したいのでご教授お願いします。 違うシステム同士でデータを利用する際、同じ使用用途でもシステムによって名称が異なる場合にも対応できるシステムを課題としています。 また、DOM方式を利用した方法だと助かります。 環境はXP、PHP5、Apache2.0です

    • ベストアンサー
    • PHP
  • Excelのドロップダウンリストの項目を作る

    ドロップダウンリストで出来る範囲がわからなくて困っています。 名前   年齢     住所 Aさん  -才  東京都○○区1-2 Bさん  -才  千葉県××区3-4-5 Cさん  -才  栃木県△△市6-7 Dさん  -才  東京都○○区8-9  :      :        : 上のような完成した表があって、各列の一番上に 名前 → 昇順、降順 (並べ替え) 年齢 → 昇順、降順 (並べ替え) 住所 → 「東京都」を含む、「千葉県」を含む、…「栃木県」を含む (抽出) とドロップリストが出るようにしたいのですが、可能でしょうか? 住所については名前順ではなく、自分が決めた順で表示させたいです。 わかる方がいらっしゃったら方法も教えてください。お願いします。

  • SQL ORDER BY の結果について

    SQLのORDER BYの結果表示がおかしく困っています。 テーブル名:社員名簿 プライマリーキー無し (設定厳禁) フィールド: | 社員ID | 氏名 | 住所 | | VARCHER|VARCHER|VARCHER| | P1 | 田中 |東京都 | | P2 | 鈴木 |東京都 | | P10 | 高橋 |千葉県 | SQL文: SELECT * FORM 社員名簿 ORDER BY 社員ID 出力結果: | 社員ID | 氏名 | 住所 | | P1 | 田中 |東京都| | P10 | 高橋 |千葉県| | P2 | 鈴木 |東京都| 上記のような出力結果となってしまいます。 何か良い方法はありませんか? よろしくお願いします

  • XMLをJSPで再帰処理を使って処理する方法について

    たびたびすみません、XMLの処理をする上でやり方がわからなくなって しまったので、教えていただきたいのですが。。。 XMLのルートノード以下のものを取得する場合、階層がはっきりしてないとき などは、再帰処理をつかってノードを取得するようにしたいと思っているんですが、JSPでの再帰処理がなかなかうまくできないんです。 再帰処理を行うクラスのメソッドが例えば、 public boolean scanEach(NodeList agNode) { try{ for(int nCnt=0;nCnt<agNode.getLength();nCnt++) { node = agNode.item(nCnt) ; if(node.getNodeType() == Node.ELEMENT_NODE){ out.println("『 "+ node.getNodeName() +"』<br>") ; } if(node.hasChildNodes()) blScanEach(node.getChildNodes()) ; } } catch(Exception except) { except.printStackTrace() ; return false ; } return true ; } と要素ノードを取り出すメソッドがあったら、out.printlnの部分が JSP内での宣言じゃないのでエラーになってしまいます。 JSPで取り出して表示できるようにしたいのですが、なにかいい方法が ないか、教えていただけないでしょうか。 再帰処理を使わなくても、例えばどの階層にあるかわからない<タグ>タグを 検索したりする方法が他にあったら、その方法もおしえていただけると ありがたいのですが。。 何度も申し訳ありません。よろしくお願いします。

    • ベストアンサー
    • XML
  • jQueryでxmlの異なるタグ要素を取得したい。

    jQueryを最近勉強したての者です。 詳しい方、どうか教えて下さい。 HTMLにxmlのデータを読み込ませようとしています。 概略をお話しすると、 htmlファイルによって、xmlの別々の要素を取得したいのです。 やりたいメソッドは同じです。 別々の要素の中のデータによって、imgの表示/非表示を切り替えたいのです。 問題は、対象となるhtmlファイルが複数あり そのhtmlファイルによって、参照するxmlのタグが異なる事なんです。 xmlは、以下のように<shopdata>をルートノードとし、以下のような感じです。 --------------------- <?xml version="1.0" encoding="utf-8"?> <shopdata> <item> <name1>0</name1> <name2>1</name2> <name3>0</name3> </item> </shopdata> --------------------- <name*>~</name*> の中のデータは、0もしくは1なのですが 0の時はimgを表示 1の時はimgを非表示させようと考えています。 ただ<name1><name2><name3> とタグ名がバラバラなんです。 ※おしりの数字が違うだけで、規則的ではあります。 ちなみにhtmlは複数あって  a.htmlの時は→xmlの<name1>を参照  b.htmlの時は→xmlの<name2>を参照  c.htmlの時は→xmlの<name3>を参照 という感じです。 ※htmlファイル名は特に規則的ではなく、いろいろなファイル名がついています。。。 最初、考えたのは、 htmlのどこかに、id="1"と入れて、idが1の時は、<name1>の要素を取得し、 htmlのどこかに、id="2"と入れて、idが2の時は、<name2>の要素を取得し… っていうことを考えたのですが、それもどのように書いたら良いのかが分からないんです。 そもそも、そういった事は可能なのでしょうか? ちなみのhtmlのbodyタグ自体がテンプレートでできているので、 idをどこかにふるとしたら、head内とかになるのしょうか? それぞれ、ボタンの表示は、 if文を使って、show(),hide()メソッドを使うとは思うのですが… 詳しくコードを教えていただけたら、助かります。 どうか、宜しくお願いいたします。

    • ベストアンサー
    • AJAX
  • PHP5 domDocumentで簡単に深いノードを取得する。但し、SimpleXMLを使わない

    環境はPHP5です。 SimpleXML(simplexml_load_file)を使わない事情がありまして、domDocumentを使っています。 $dom = new domDocument(); $dom->load("example.xml"); $root = $dom->documentElement; foreach($root->childNodes as $elems) { if ($elems->nodeType == XML_ELEMENT_NODE && $elems->nodeName == "Items") { ... ... ... 例えば以下のようなXMLの場合、<D2>のyyyyyを取得する為に上のプログラムだと、 foreach, ifのネストが深くなり、階層が深くなるにつれてプログラムの記述も増えて 非常に面倒ですが、$rootを使って、yyyyyの値を1行程度で取得する方法ないのでしょうか? <A> <Items> <B1></B1> <B2> <C> <D1>xxxxx</D1> <D2>yyyyy</D2> </C> </B2> <B3></B3> </Items> </A>

    • ベストアンサー
    • PHP
  • 各ノードの行数取得

    MSXMLのDOMを使っているのですが、ノードを取得した際に、 実際読み込んだXMLの行数の取得は出来ないのでしょうか? 例えば、 1 <data> 2 <item>○○○○</item> 3 <item>××××</item> 4 <item>△△△△</item> 5 </data> ××××のitemノードを取得した際に、3行目という情報を 取得したい。 以上です。 ご教授ください。 よろしくお願いします。

    • ベストアンサー
    • XML
  • テキストファイルの特定のものだけの抽出方法

    はじめまして。質問させていただきます。 テキストファイルに一行ずつ、バラバラの個人情報が入っているのですが (例:千葉県・東京都・茨城県・千葉県・群馬県・千葉県など) それを特定の一つだけを残したいのです。 (例:千葉県・千葉県・千葉県) その抽出方法を教えていただけませんでしょうか?

  • WWWドメイン名の代理取得サービスありませんか?

    個人で使いたいドメイン名を取得したいのですが、 通常のドメイン名取得サービスでは、 「Whois」に個人名や住所などを晒さねばならず、 その気になれば誰からも個人情報を見られてしまいます。 なんらかの問い合わせがあった場合に、ドメイン名取得者として、対応するのは当然ですが、「Whois」で直接、個人情報を見られたくはありません。 そのために、代理でドメイン名を取得してくれるサービスのようなものはないでしょうか?(日本語対応業者で) 問い合わせがあった場合には、問い合わせ元に連絡先などを開示するのはかまいませんが、「Whois」で無防備に晒しっぱなしにしたくはないという趣旨です。   また、昨今の個人情報問題に関して、このような、「Whois」のシステムは問題があると思うのですが、 それに関して言及しているサイトなどがあれば知りたいです。

専門家に質問してみよう