XmlDocumentの読み込みについて

このQ&Aのポイント
  • XmlDocumentを使用してXMLファイルを読み込み、指定した条件に基づいてデータを取得する方法を説明します。
  • 具体的な例として、指定したXMLファイル(test.xml)から特定の学科の一番最後のnumberを取得し、TextBoxに表示する方法を紹介します。
  • XmlDocumentクラスのLoadメソッドを使用して、XMLファイルを読み込みます。そして、SelectNodesメソッドを使用して指定した条件(./root/学科)に基づいてノードの一覧を取得します。その後、取得したノードリストの最後のノードを取得し、その中のテキストを数値に変換してTextBoxに表示します。
回答を見る
  • ベストアンサー

XmlDocumentの読み込みについて

<?xml version="1.0" encoding="utf-8" ?> <root>     <学科 name="普通">       <number>01</number>       <number>02</number>       <number>03</number>       <number>04</number>     </学科>     <学科 name="経理">       <number>01</number>     </学科>     <学科 name="情報">       <number>01</number>     </学科> </root> 上記のようなtest.xmlがあり、下記のソースで学科:普通の一番最後のnumber(今回の場合は"04")を取得し、TextBoxに出力したいのですが、どのように修正すればいいのでしょうか? Dim xmlDocument As XmlDocument Dim xmlNodeList As XmlNodeList Dim lastElem As XmlElement Dim lastNum As Integer xmlDocument = New XmlDocument xmlDocument.Load("test.xml") xmlNodeList = xmlDocument.SelectNodes("./root/学科") lastElem = xmlNodeList(0).LastChild lastNum = Integer.Parse(lastElem.InnerText) Textbox.Text = lastElem.ToString

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

  • ベストアンサー
回答No.1

この2箇所でしょうかね・・・。 Dim lastElem As XmlElement  ↓ Dim lastElem As XmlNode Textbox.Text = lastElem.ToString  ↓ Textbox.Text = lastElem.InnterText

lotus1988
質問者

補足

修正しましたが、lastElem = xmlNodeList(0).LastChildで"オブジェクト参照がオブジェクト インスタンスに設定されていません。"というエラーが発生してしまいます。

その他の回答 (1)

回答No.2

> lastElem = xmlNodeList(0).LastChildで"オブジェクト参照がオブジェクト インスタンスに設定されていません。" つまり、xmlNodeList(0).LastChild または xmlNodeList のどちらかが空っぽということですね・・・。 ですが同じコードで動かしても、こちらでは問題なく動作しています。 ただ、XMLのほうは全角スペースがあったので修正しました。質問投稿のインデントために入れられたものだと勝手に判断していましたが、元のXMLに全角スペースがあるようなら半角スペースに置き換えて試してみて下さい。

関連するQ&A

  • xmlの値を配列に格納したいんですけどエラーがでてしまう。

    <?xml version="1.0" encoding="UTF-8" ?> <Dataroot> <aaa> <bbb> <ccc>値1</ccc> </bbb> <bbb> <ccc>値2</ccc> </bbb> </aaa> </Dataroot> ---------------------------------------------------------------- のようなXML文書がある時<ccc></ccc>の値を取り出す場合 ---------------------------------------------------------------- Imports System Imports System.IO Imports System.Xml public class Sample public shared sub Main() Dim doc as XmlDocument = new XmlDocument() doc.Load("data.xml") 'XML文書の読み込み Dim root as XmlElement = doc.DocumentElement Dim nodeList as XmlNodeList nodeList = root.SelectNodes("/Dataroot/aaa/bbb")'/cccまでやる方が簡単 Dim node as XmlNode Dim ccclist() As String = Nothing for each node in nodeList ccclist(nodeList.Count) = node.SelectSingleNode("ccc").InnerText '内容の取り出し next end sub end class としているのですが ccclist(nodeList.Count) = node.SelectSingleNode("ccc").InnerText '内容の取り出し この行で オブジェクト参照がオブジェクト インスタンスに設定されていません。 とエラーがでて困っています。 これはどのように修正すればよろしいでしょうか? 教えてください。お願いします。

  • xmlの読込みについて

    <?xml version="1.0" encoding="utf-8" ?> <root>     <学科 name="普通">       <number>001</number>         <人名>A君</人名>       <number>002</number>         <人名>B君</人名>       <number>003</number>         <人名>C君</人名>       <number>004</number>         <人名>D君</人名>     </学科>     <学科 name="経理">       <number>001</number>         <人名>E君</人名>     </学科>     <学科 name="情報">       <number>001</number>         <人名>F君</人名>     </学科> </root> 上記のようなtest.xmlファイルがあり、普通科のD君のnumberをtextboxに出力したいのですが、どういった処理を行えばよろしいでしょうか?

  • C#のXmlDocumentについて

    C#のXmlDocumentについて質問です。 using System; using System.Xml; using System.Windows; public class XmlNewClass{ public static void Main(String [] args){ XmlDocument xmlObj = new XmlDocument(); xmlObj.Load("./test.xml"); XmlNode nodeObj = xmlObj.GetElementsByTagName("root").Item(0); Console.WriteLine(nodeObj); } } 上記のようなコードがあったとします。 この場合、プロンプトに表示されるないようは 〔System.Xml.XmlElement〕という記述が出力されます。 次に XmlElement elementObj =nodeObj; というコードを追加したとします。 それを実行してみると /****************************************************************** xml.cs(21,26): error CS0266: 型 'System.Xml.XmlNode' を 'System.Xml.XmlElement' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) ***************************************************************************/ というようなエラーがプロンプト上に表示されます。 これはnodeObjがXmlNodeというクラスだということですが (実際GetElementsByTagNameで帰って来るオブジェクトはXmlNodeというクラスだとマニュアルにも記載がありました) なぜ冒頭のコードで Console.WriteLine(nodeObj); の箇所の出力で〔XmlElement〕という内容が出力されたのでしょうか? 同じオブジェクトなのに、なぜ出力と型がことなるのでしょうか? ご教授よろしくお願いします。

  • HasAttributes 的な関数はないでしょう

    お世話になります。 C# WPFで作成しております。 C#でXMLファイルを読み込んで、「view」アトリビュートがあるタグにだけ 処理をしたいと思い下記のソース・xmlを作成しました。 しかしながら、number=1にはviewアトリビュートもあるのですが、 number=2以降はアトリビュートがないのでエラーがでます。 しかしながら、全てのpageタグにviewアトリビュートをつける手間を 増やしたくありません。 viewアトリビュートがあれば、中を見て、if分チェック、タグがなければ、無視をして エラーを出さずに処理を続けるにはどうしたらよいでしょうか? お手数ですがよろしくお願い致します。 --------------C#ソース------------- xmlDocument = new XmlDocument(); xmlDocument.Load(XML文書); //読み込み XmlNodeList nodeList = xmlDocument.SelectNodes("/data/page");//page以下のノードを読み込み int count = nodeList.Count; for (int i = 0; i < count; i++) { if("on"==nodeList[i].Attributes["view"].Value) //viewタグがonなら処理をする {         処理をする } } ----------xml---------- <data> <page number="1" view="on"></page> <page number="2" ></page> <page number="3" ></page> <page number="4" ></page> ------------------------ </data>

  • TextBoxをInteger型の変数に代入したい

    開発環境は、VB2005 ExpressEditionです。 TextBoxをInteger型の変数に代入したいのですが。 Dim num01 As Integer 1 num01 = Int(TextBox1.Text) 2 num01 = CInt(TextBox1.Text) 3 num01 = Integer.Parse(TextBox1.Text) 1,2,3どれで実行しても”入力文字列の形式が正しくありません。”とでてしまいます。どなたか良い方法をご存知の方がいたら、教えて下さい。

  • VBプログラム エラーが出ます

    Public Class Form1 Private number As Integer Private rows As Integer Private columns As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 800) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sum As Double Dim cnt As Integer = 0 For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 : If cnt > rows * columns Then cnt = 1 tb.Name = "tbA" + cnt.ToString Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + (80 + 40 * rows) tb.Left = (j - 1) * 60 + 10 tb.Width = 40 sum = 0 For k As Integer = 1 To number sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * k-1))).ToString(), TextBox).Text)    エラー Next tb.Text = sum.ToString() Next Next End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Do Until Me.Controls.Count <= 6 For Each tbD As Object In Me.Controls If CType(tbD, Control).Name Like "tb*" Then Me.Controls. Remove(tbD) Next Loop End Sub End Class エラーと書いている箇所 どう直したらよいのでしょうか。 縮小変換しないで呼び出されるアクセス可能なitemがないためオーバーロードの解決に失敗しました と出ます。 あとwindowsの画面の大きさを入力される値が小さければ少し小さいwindowsになるように変えたいのですがどうしたよいのでしょう。

  • VBのGUI 行列の和を求める

    VBのGUIです。 行列の足し算を行うプログラムをつくりたいです。 以下のプログラムはできたところまで作成しています。 □個の□行□列(□はテキストボックス)の所に例えばユーザーが3 3 3と入力したとします。 ボタン1を押すと3×3の3個個分のテキストボックスがでてきて、要素を打ち込めるようになります。 そしてユーザが要素を打ち込みます。次に要素が 1 2 1  2 1 2   2 1 2 2 1 2  1 2 1   1 2 1 1 2 1  2 1 2   1 2 1 というように入力されたとします。 ボタン2を押すと 3×3のテキストボックスが出てきて この3つの行列の和を足した 5 4 5 4 5 4 4 5 4というようにテキストボックスに表示されるようにしたいです。 3この3行3列の和だけでなく何個の何行何列の場合でもできるようにしたいです。 どのようなソースでこのプログラムはできるのでしょうか。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Bounds = New Rectangle(10, 10, 1300, 800) Dim number As Integer Dim rows As Integer Dim columns As Integer If Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If Not Integer.TryParse(TextBox1.Text, rows) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If Not Integer.TryParse(TextBox2.Text, columns) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If For k = 1 To number For i = 1 To rows For j = 1 To columns Dim tb As TextBox = New TextBox() tb.Name = "R" & i.ToString() & "C" & j.ToString() & "No" & k.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim number As Integer Dim rows As Integer Dim columns As Integer Dim r As Integer Dim n As Integer Dim m As Integer Dim sum As Double sum = 0 For n = 1 To columns For m = 1 To rows sum = 0 For r = 1 To number Next For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() tb.Name = "R" & i.ToString() & "C" & j.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 10 tb.Width = 40 Next Next Next Next End Sub End Class

  • VB2005でUTF-8からshift_JISに変換する方法

    VB2005の初心者です。 UTF-8のXMLデータで、一部日本語の項目が化けているのでshift_JISに変換したいのですが、やり方が分りません。 下記のとおり、XMLデータから項目を抽出して、ログに出力すると化けてしまいます。 Dim CreatorInfodNode As Xml.XmlNodeList CreatorInfodNode = xmlDoc.SelectNodes("/Mml/MmlBody/MmlModuleItem/docInfo[@contentModuleType=contains(@contentModuleType,'patientInfo')]" + _ "/mmlCi:CreatorInfo/mmlPsi:PersonalizedInfo/mmlPsi:personName/mmlNm:Name/mmlNm:fullname", nsmgr1) LbLogFlg = WriteLogFile("fullname:" + CreatorInfodNode(0).InnerText.Trim) ↓ログの出力結果 fullname:????????????????????? 皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。

  • VBAのUserFormでサブルーチンを用いる

    UserFormのコードに次のように書いてbuttomを押してみると コンパイルエラー:ByRef引数の型が一致しません。 と出てしまいます。 どこが間違っているのでしょうか?ご回答お願いします。 Private Sub buttom_Click() Dim i As Integer Dim name As String i = 1 name = "名前" Call test(i , name) End Sub ---------------------------------------------- Sub test(i As Integer, name As String) Cells(i , 1) = name End Sub

  • 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 何かヒントになるようなことでも良いので、皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。