• 締切済み

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% (1626/5665)
回答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% (1626/5665)
回答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