• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:XMLからデータを取得)

XMLからデータを取得する方法とは?

このQ&Aのポイント
  • XMLファイルから特定のデータを検索するプログラムの作り方を教えてください。
  • XMLデータの形式は、AAAタグの中にBBBとCCCタグがあり、CCCタグは最大5個まで存在します。
  • VB2008を使用して、フォームにテキストボックスを配置し、AAAタグのNameの中身と合致したら、BBBとCCCの属性を取得して表示する方法を教えてください。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

a_navi.Select("//AAA[@Name='test']") で AAAタグの検索条件を増やさないのであれば xml_data = a_navi.Select("//AAA[@Name='test']") while xml_data.MoveNext   Dim xmldoc As New Xml.XmlDocument   ' XMLDocumentに 選択されたCurrentのOuterXmlを与えれば   ' 自前で XML形式の体裁を整える必要がありません   xmldoc.loadXML( xml_data.Current.OuterXml)   ' StringReaderにも OuterXmlで与えます   a_xml = new Xml.XmlTextReader(New IO.StringReader(xml_data.DocumentElement.OuterXml))   while a_xml.Read     If a_xml.NodeType = XmlNodeType.Element Then       Select Case a_xml.LocalName         ' AAAタグ用の分岐を定義         Case "AAA"           Console.WriteLine("aaa:" & a_xml.GetAttribute("age") & "," & a_xml.GetAttribute("id"))         Case "BBB"           Console.WriteLine("bbb:" & a_xml.GetAttribute(0) & "," & a_xml.GetAttribute(1))         Case "CCC"           Console.WriteLine("ccc:" & a_xml.GetAttribute(0))       End Select     End If   end while end while といった具合でよさそうですよ

samalf
質問者

お礼

何度もありがとうございます。今後属性が増えても大丈夫そうです。 これを機にもう少しXMLの扱いを勉強していきたいと思います。 重ね重ねありがとうございました。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

> もしAAAタグのName以外に属性があるとしたら、どのようにすれば > 取得できるのでしょうか? 具体例を挙げて質問してみましょう <AAA Name="test" att1="sub1">   <bbb x="1" y="2"/> </AAA> <AAA Name="test">   <bbb x="3" y="4"/> </AAA> <AAA Name="test" att1="sub2">   <bbb x="5" y="6"/> </AAA> <AAA Name="test" att2="ext1">   <bbb x="5" y="6"/> </AAA> といったデータの場合 a_navi.Select("//AAA[@Name='test']") とすれば 4要素すべて取得します a_navi.select("//AAA[@Name='test'][@att1]") とすれば Name="test" かつ att1がある要素が選択されます a_navi.select("//AAA[@Name='test'][@att1='sub1']") とすれば Name="test" かつ att1="sub1"の要素が選択されます

samalf
質問者

お礼

>具体例を挙げて質問してみましょう またもや失礼しました、二回目なのに…… たくさんの例まであげていただいてありがとうございます。 検索条件を絞ることもできるんですね。 <AAA Name="test" Age="20" Id="123456">    <BBB x="2" y="2"></BBB>    <CCC Num="0001"></CCC>    <CCC Num="0002"></CCC> </AAA> となっていた時、Nameで検索しヒットしたら、BBB、CCCタグの属性と一緒にAAAタグのAge、Idも取得するというものでした。 もし差し支えございませんでしたらまたご教授ください…… 何度もすみません……

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

xml_dataでMoveNextを行っていないのが原因のように思います   dim xml_data as System.Xml.XPath.XPathNodeIterator = a_navi.Evaluate("//AAA[@Name='(検索条件)']")   while xml_data.MoveNext   dim sbl as new Text.StringBuilder   ' XMLの体裁を整える   sbl.AppendLine("<dummyroot>")   sbl.Append( xml.Current.InnerXml )   sbl.AppendLine("</dummyroot>")   dim a_xml as a_xml As New System.Xml.XmlTextReader(New System.IO.StringReader(sbl.toString))   While a_xml.Read     If a_xml.NodeType = Xml.XmlNodeType.Element Then       Select Case a_xml.LocalName         Case Is = "BBB"           Console.WriteLine("xの値:" & a_xml.GetAttribute(0) & " yの値:" & a_xml.GetAttribute(1))         Case Is = "CCC"           Console.WriteLine("Numの値:" & a_xml.GetAttribute(0))       End Select     End If   End While といった具合で xml_data.MoveNextを実行することによりxml_data.Current.InnerXmlが <AAA Name="テスト">    <BBB x="2" y="2"></BBB>    <CCC Num="0001"></CCC>    <CCC Num="0002"></CCC> </AAA> の抽出部分だけになりますので これを StringBuilderにて <dummyroot>   <AAA Name="テスト">    <BBB x="2" y="2"></BBB>    <CCC Num="0001"></CCC>    <CCC Num="0002"></CCC>   </AAA> </dummyroot> といった具合にXMLの体裁を整えて XmlTextReaderに与えています

samalf
質問者

お礼

ありがとうございます、無事に動きました。 ソースだけでなく、XMLのほうがどうなっているのかも書いていただきありがとうございます。 StringBuilderなんて初めて見た……勉強になります。 ついで……といってはアレですが、 もしAAAタグのName以外に属性があるとしたら、どのようにすれば取得できるのでしょうか? もしよろしければ、ご教授お願いします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

> どうにも上手くいきません。 と抽象的な表現をするのではなく、現在実行しているコード、そのデータ、実行結果、希望する結果 などを明示して質問しましょう データ自体を DataSetまたはDataTableへ読み込んでいるのか Sysytem.Xmlクラスで実行しているのか によってもコーディングは変わってきますよ

samalf
質問者

補足

失礼しました、上の質問の内容の補足として付け加えさせていただきます。 XMLの読み込みは、XPathを使って以下のようにやってます。 Dim A As New System.Xml.XPath.XPathDocument("test.xml") Dim a_navi As System.Xml.XPath.XPathNavigator = A.CreateNavigator Dim xml_data As System.Xml.XPath.XPathNodeIterator = a_navi.Evaluate("//AAA[@Name='(検索条件)']") Dim a_xml As System.Xml.XmlTextReader = New System.Xml.XmlTextReader(New System.IO.StringReader(xml_data.Current.InnerXml)) While a_xml.Read   If a_xml.NodeType = Xml.XmlNodeType.Element Then     Select Case a_xml.LocalName       Case Is = "BBB"         Console.WriteLine("xの値:" & a_xml.GetAttribute(0) & " yの値:" & a_xml.GetAttribute(1))       Case Is = "CCC"         Console.WriteLine("Numの値:" & a_xml.GetAttribute(0))     End Select   End If End While このコードだと、AAAタグのNameと合致した部分の子ノードだけでなく、 XMLファイルの上から下まで全部を出力してしまいました。

関連するQ&A