質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

8471閲覧

xml読み込み時に子リストをすべて取得する方法

netta

総合スコア43

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/04/04 05:02

vb.netでXMLファイルを読み込んで子リストをすべて取得するプログラムを作成しています。
すべてのnameとpathを取得したいのですが方法がわからないのでご教授いただきたいです。

XML

1<?xml version="1.0" encoding="Shift_JIS" ?> 2<doc> 3 <folder> 4 <name>取得元</name> 5 <path>C:\仕事\取得元\</path> 6 </folder> 7 <folder> 8 <name>担当csv</name> 9 <path>C:\仕事\担当.csv</path> 10 </folder> 11 <folder> 12 <name>使用しない</name> 13 <path>C:\仕事\_使用しない</path> 14 </folder> 15 <folder> 16 <name>キャンセル</name> 17 <path>C:\仕事\キャンセル</path> 18 </folder> 19 <folder> 20 <name>その他</name> 21 <path>C:\仕事\その他</path> 22 </folder> 23</doc>

vb.net

1' XMLを扱うためのオブジェクト 2Dim xmlDoc As New XmlDocument() 3Dim xroot As XmlNode 4Dim xfolder As XmlNodeList 5Dim xname(4) As String 6Dim xpath(4) As String 7Dim xnode As XmlNode 8Dim i As Integer = 0 9 10' XMLを読み込む 11xmlDoc.Load("C:\仕事\使用フォルダ.xml") 12 13' XMLドキュメントからルート要素を取り出す 14xroot = xmlDoc.DocumentElement 15 16'ルート要素から親リストを取得する 17xfolder = xroot.SelectNodes("//doc/folder") 18 19'親リストから親要素を取り出す 20For Each xnode In xfolder 21 '親要素の中の子リストを取り出す 22 '↓以下2行で取得しようとしているのですが"Nothing"で取得できないので悩んでいます 23 xname(i) = xnode.SelectSingleNode("//folder/name").Value 24 xpath(i) = xnode.SelectSingleNode("//folder/path").Value 25 i = i + 1 26Next

環境はVisual Studio2008,VB.netです。
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問者さんのコードでXMLから指定要素の値を取れない原因は2つあります。

SelectSingleNodeでのnameとpath要素へのXPATHの指定に誤りがあるのが原因の1つ目です。"//doc/folder"指定で"<doc><folder>"で起点とするノードを指定できているわけですから、この場合は"name"と"path"だけにすべきです。

2つ目は、xnode.SelectSingleNode("正しいXPATH").Valueの部分で、Valueプロパティはその要素のXmlNodeTypeがテキスト(文字列)の場合のみセットされます。それ以外はNothingです。ここが合っていません。以下のドキュメントを参照してください。
Microsoft Doc - XmlNode.Value Property

<doc><folder><name>取得元</name>の"取得元"のテキスト部分は、<name>要素の子であるひとつのノードです。この部分が現状のコードでは正しく指し示されていません。以下のように子ノードを指すようにすれば、Valueプロパティが使えます。

VB

1Dim s As String 2s = xnode.SelectSingleNode("name").FirstChild.Value

もうひとつ、"取得元"を<name>InnerTextとして取得する方法があります。

VB

1Dim s As String 2s = xnode.SelectSingleNode("name").InnerText

質問者さんのコードをもとに上記を適用し、以下のコードで確認しました。Windows XP上のVisual Studio 2008 + .NET Framework 2.0 のSystem.Xml と、Windows 7 上のVisual Studio 2017 + .NET Framework 4.0 のSystem.Xmlで同じ挙動でしたので不安は無いと思います。

VB

1 Dim s As String 2 3 '親リストから親要素を取り出す 4 For Each xnode In xfolder 5 '親要素の中の子リストを取り出す 6 7 ' テキストノードとして取り出す 8 xname(i) = xnode.SelectSingleNode("name").FirstChild.Value 9 xpath(i) = xnode.SelectSingleNode("path").FirstChild.Value 10 11 Debug.WriteLine("--- " & i) 12 Debug.WriteLine("name: " & xname(i)) 13 Debug.WriteLine("path: " & xpath(i)) 14 15 ' "name", "path"ノードのInnerTextとして取り出す 16 s = xnode.SelectSingleNode("name").InnerText 17 Debug.WriteLine("name(InnerText): " & s) 18 19 s = xnode.SelectSingleNode("path").InnerText 20 Debug.WriteLine("path(InnerText): " & s) 21 22 i = i + 1 23 Next

以下のように出力ウインドウ(デバッグ端末)に出力されます。

--- 0 name: 取得元 path: C:\仕事\取得元\ name(InnerText): 取得元 path(InnerText): C:\仕事\取得元\ --- 1 name: 担当csv path: C:\仕事\担当.csv name(InnerText): 担当csv path(InnerText): C:\仕事\担当.csv --- 2 name: 使用しない path: C:\仕事\_使用しない name(InnerText): 使用しない path(InnerText): C:\仕事\_使用しない --- 3 name: キャンセル path: C:\仕事\キャンセル name(InnerText): キャンセル path(InnerText): C:\仕事\キャンセル --- 4 name: その他 path: C:\仕事\その他 name(InnerText): その他 path(InnerText): C:\仕事\その他

動作させながらデバッガーでxnodeなどの変数をウォッチして確認してみてください。

投稿2019/04/04 10:24

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

netta

2019/04/05 02:41

お忙しいところありがとうございます。 サンプルソースで実際動かしてみたところ意図した動きになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問