• 締切済み

XMLの解析に関して

XMLの解析を行いたいのですが、 ちょっと困っています。 最初はSelectNodesメソッドを利用し 複数情報を取り出そうと考えていたのですが、 下記の様な場合に対応出来なくなってしまいました。 <A1> <A2><A2> </A1> <B1> <B2></B2> <B2></B2> <B2></B2> <B2></B2> </B1> <A1> <A2><A2> </A1> <B1> <B2></B2> <B2></B2> <B2></B2> <B2></B2> </B1> A1とB1がセットにて2件の情報が返ってきているのですが、 同じタグ名な為、 SelectNodes("B1")で取り出した際に、 どれが1個目のA1の情報で どれが2個目のA1の情報か判断付きませんでした。 (*B1の数は常に変動します) 何かうまい方法ないでしょうか。 詳しい方いましたらどうぞよろしくお願いします。

みんなの回答

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.4

B2 の直前の A1 の子要素 A2 のテキストを取得 preceding-sibling::A1[position()=1]/A2/text() でも、 [ANo.3]>『「構造を考え直すべし」という #2 の指摘には同意.』 には同意。 ■ 確認 [q7568320.xml] <?xml version="1.0" encoding="UTF-8" ?> <!--?xml-stylesheet type="text/xsl" href="q7568320.xsl"?--> <root>   <A1><A2>1</A2></A1>   <B1><B2/><B2/><B2/><B2/></B1>   <B1><B2/><B2/><B2/><B2/></B1>   <B1><B2/><B2/><B2/><B2/></B1>   <B1><B2/><B2/><B2/><B2/></B1>   <A1><A2>2</A2></A1>   <B1><B2/><B2/><B2/><B2/></B1>   <B1><B2/><B2/><B2/><B2/></B1>   <B1><B2/><B2/><B2/><B2/></B1> </root> [q7568320.xsl] <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0"     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   <xsl:output method="xml" encoding="UTF-8"/>   <xsl:template match="/">     <xsl:apply-templates select="root" />   </xsl:template>   <xsl:template match="root">     <result>       <xsl:apply-templates />     </result>   </xsl:template>   <xsl:template match="A1" />   <xsl:template match="B1">     <xsl:copy>       <xsl:attribute name="A2">         <xsl:value-of select="preceding-sibling::A1[position()=1]/A2/text()" />       </xsl:attribute>       <xsl:apply-templates select="@*|node()" />     </xsl:copy>   </xsl:template>   <xsl:template match="@*">     <xsl:copy />   </xsl:template>   <xsl:template match="node()">     <xsl:copy>       <xsl:apply-templates select="@*|node()" />     </xsl:copy>   </xsl:template> </xsl:stylesheet> ■ 結果 $ xsltproc q7568320.xsl q7568320.xml <?xml version="1.0" encoding="UTF-8"?> <result>         <B1 A2="1"><B2/><B2/><B2/><B2/></B1>         <B1 A2="1"><B2/><B2/><B2/><B2/></B1>         <B1 A2="1"><B2/><B2/><B2/><B2/></B1>         <B1 A2="1"><B2/><B2/><B2/><B2/></B1>         <B1 A2="2"><B2/><B2/><B2/><B2/></B1>         <B1 A2="2"><B2/><B2/><B2/><B2/></B1>         <B1 A2="2"><B2/><B2/><B2/><B2/></B1> </result> $

s02152170
質問者

お礼

御回答ありがとうございます。 SelectNodes("A1|B1")でList作成して for文で回しタグ名確認しながら情報取り出そうと思ったのですが、 >preceding-sibling::A1[position()=1]/A2/text() 今回のケースに合うか調べてみます。 サンプルありがとうございます。 自分も激しく同意です・・・ ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

XPath を使えば指定できそうだけど, 「構造を考え直すべし」という #2 の指摘には同意.

s02152170
質問者

お礼

御回答ありがとうございます!! その方が自分も嬉しいです・・・ ってか、自分もそう作成します。 自分も同意します(笑) 御回答ありがとうございましたm(_ _)m

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.2

>タグ名はA1とB1の2つのグループしかないのですが、 >グループの構成が異なります。 (以下略) やりたいことはわかりましたけど、どちらかといえばxmlの構造が不適切な気がします。 もしやるとするならSelectNodes("A1")で取得したノードの後ろにB1ノードがいくつ続くかで判定することになるのではないでしょうか。 xmlの構造を変更してよいのでしたら <Group> <A1><A2/></A1> <B1><B2/><B2/><B2/><B2/></B1> <B1><B2/><B2/><B2/><B2/></B1> <B1><B2/><B2/><B2/><B2/></B1> <B1><B2/><B2/><B2/><B2/></B1> </Group> <Group> <A1><A2/></A1> <B1><B2/><B2/><B2/><B2/></B1> <B1><B2/><B2/><B2/><B2/></B1> <B1><B2/><B2/><B2/><B2/></B1> </Group> の方が簡単になると思いますが。

s02152170
質問者

お礼

御回答ありがとうございます!! その方が自分も嬉しいです・・・ ってか、自分もそう作成します。 あくまで自分が今やっているのは 解析部分だけですので、 そういうものだと思って解析かけています。 とりあえず、あまり好きではないのですが、 最初考えていたSelectNodes("A1|B1")にして 中身解析かけてみようと思います。 何度もありがとうございましたm(_ _)m

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.1

どの言語の何でxmlを解析しようとしてるのか書きませんか。 ご自分だけが理解できる質問文を書かれても回答できる人はなかなかいないはずです。 >A1とB1がセットにて2件の情報が返ってきているのですが、 >同じタグ名な為、 >SelectNodes("B1")で取り出した際に、 >どれが1個目のA1の情報で >どれが2個目のA1の情報か判断付きませんでした。 >(*B1の数は常に変動します) SelectNodes("B1")で取り出したノードはB1ノードのわけですから、1個目のA1とか2個目のA2があるわけないんですが・・・ 取り出したB1ノードの前にあるA1ノード、後ろにあるA1ノードなら取得できると思いますけど。

s02152170
質問者

補足

すいません、書き忘れてました・・・ C# VS2005です。 >SelectNodes("B1")で取り出したノードはB1ノードのわけですから、1個目のA1とか2個目のA2がある>わけないんですが・・・ >取り出したB1ノードの前にあるA1ノード、後ろにあるA1ノードなら取得できると思いますけど。 タグ名はA1とB1の2つのグループしかないのですが、 グループの構成が異なります。 例 1個目、A1 1つに対してB1が4つ紐づく 2個目 A1 1つに対してB1が3つ紐づく SelectNodes("B1")で7つの情報が引き出せるが、 1個目のA1か2個目のA2の情報かわからないと思いました。 すいません、まだ頭の中でしか考えてないので、 完全な勘違いなら本当にすいません・・・

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CGIでXML解析したいです

    この質問はCGIで投稿したのですがこちらの方が適切ですかね? XML形式のクエリーを送信させてそれをPERLで解析したいのですがうまくいきません。 <LOGIN USERNAME="hanako" PASSWORD="875" /> 上記形式のXML(将来的には情報を付加)なんですがFLASHから生成させています。 環境変数など調べてみたのですがメソッドはPOST,CONTENT_LENGTHもしっかり入っています。 どこに送られてきたデータがあるのでしょうか、またXMLを解析するモジュールでもあるのでしょうか(XML::DOM,PARSER?使用方法が乏しいです)、よろしくお願いします。

  • VB2005でXMLデータから複数ある要素の数を読み取る方法

    VB2005、XMLの初心者です。 VB2005でXMLデータを読み取って、DBに登録するプログラムを作っています。 XMLデータから項目を読み取るのは、下記のようにパスを指定してできることが分りました。 CreatorInfodNode = xmlDoc.SelectNodes("/Mml/Body/Module", nsmgr1) ID = CreatorInfodNode(0).InnerText.Trim しかし、下記のような同じ要素が複数あるXMLデータの場合、全ての要素を解析してDBに登録したいのですが、要素の数はどうやって読み取れば良いのでしょうか。ちなみに、要素の数は可変です。 上記のパスを指定する場合、要素のタグが同じなら全てパスは同じになり、最初の要素を取ってくるようですが、複数ある場合は全てを解析したいです。 <Mml> <Body> <Module>A</Module> <Module>B</Module> <Module>C</Module> </Body> </Mml> 何かヒントになるようなことでも良いので、皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。

  • VB.NETでテキストファイルの解析についてヒントをいただけないでしょ

    VB.NETでテキストファイルの解析についてヒントをいただけないでしょうか? 通常のテキストファイルなのですが中身は 「<div class=・・・」といったようなタグが記述されています。 特定のクラス名を見つけたらそのデータをテキストボックスに反映させたいのですがテキストファイルのタグを解析するメソッドなどが見つかりません。xmlではないのでその解析は使えないと思うのですが・・・どのようにやるのがいいものでしょうか?

  • XMLからXML

    こんにちわ。 以下のやり方がわからなく、困っています。 XSLTを使って以下のようなXML→XMLを行いたいのですが。 変更前: <a> <b> <c>abc</c> <d>def</d> </b> </a> 変更後: <b> <c>abc</c> <d>def</d> </b> ようするに、指定したタグ以下のXML構造をそのまま取り出したいのです。 <xsl:template match="/a"> <xsl:apply-templates select="b"/> </xsl:template> だと中身のabc defしか取れません。 <c>とか<d>は、時によって変わる場合、どのようなXSLT を書けばよいのでしょうか? 申し訳ありませんが、わかる方がいれば教えてください。

    • 締切済み
    • XML
  • XMLでの表示について

    XML初心者です。 XMLに下記のような並びでタグが構成されているときに XSLで上から順に読み込み前回と重複する内容の時は その値を表示しないようにしたいのです。XSLにどう書いて制御すれば よいか途方にくれています。ご存知の方ご教授頂きたく思います。 よろしくお願いします。 XMLでのタグ構成         IE上で表示させたい結果 <a1>001</a1>        001   <a1>002</a1>        002 <a1>002</a1> <a1>002</a1> <a1>001</a1>

    • 締切済み
    • XML
  • 2つのxmlファイルを利用したリレーションシップ(?)に関して

    2つのxmlファイルを使用し、リレーションシップ(?)を作成してDataGridViewに表示させようとしているのですがうまくいきません。ご教授お願いいたします。 xmlファイル1: <タグ1> <タグ2 属性21="a1" 属性22="a2"></タグ2> <タグ2 属性21="b1" 属性22="b2"></タグ2> <タグ2 属性21="c1" 属性22="c2"></タグ2> </タグ1> xmlファイル2: <タグ1> <タグ2 属性21="a1" 属性22="d2"></タグ2> <タグ2 属性21="b1" 属性22="e2"></タグ2> <タグ2 属性21="c1" 属性22="f2"></タグ2> </タグ1> 表示させたい内容: | d2 | a2 | | e2 | b2 | | f2 | c2 |

  • 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
  • XMLを動的に読む

    ワードプレスなどで行われているPHP⇔MYSQLのような動きを、javascript⇔XMLでやりたいです。 具体的に言うと、 index.htmlでボタンAを押されるとdata.xmlのA情報がindex.htmlに表示される index.htmlでボタンBを押されるとdata.xmlのB情報がindex.htmlに表示される というものです。 Ajaxなど調べているのですが、なかなかいい情報が見つかりません。 てってきたいのはテキスト情報だけですので、なるべくシンプルで簡単なコードが知りたいのですが、複雑な部分が多くて困っています。 簡単なやり方が紹介されているサイトや簡単なサンプルを見せてもらえるととても助かります。

  • XMLとかで出来ますか?

    XMLもXSLもXSLTも何も知らないので出来るのかわかりませんが。 Aに1・2という情報?属性?を付けて Bに2・3を付けて Cに1を付けて 1が付いているのはA・C 2が付いているのはA・B 3が付いているのはB というように表示するにはどうすればいいでしょう?

    • 締切済み
    • XML
  • VB2005でXMLから複数ある要素の項目を取得する方法

    VB2005、XMLの初心者です。 下記XMLの「ヤマダタロウ」を抽出するのがうまくいきません。 <Module> <Body> <Item Code= A TableId=001> <Name>ヤマダタロウ</Name> </Item> <Item Code= B TableId=001> <Name>山田太郎</Name> </Item> </Body> </Module> 上記XMLがmsxmlDocとして引数で下記プロシージャに渡されるのですが、selectNodesではなぜか取得できません。 どこか間違っているでしょうか。 Private Sub prvParseXML(Byval msxmlDoc As MSXML2.DOMDocument) Dim NodeList As MSXML2.IXMLDOMNodeList NodeList = msxmlDoc.selectNodes("/Module/Body/Item[@Code='A'][@tableId='001']/Name") End Sub 何かヒントになるようなことでも良いので、皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。