• ベストアンサー

VB.2005でXMLを読み込む時のパス設定

Javaで作成されたXMLをVB.net2005で読み取る際にVBでのXMLへのパス指定に関する質問です。開発環境はVisualStadio2005です。 javaで「D\Sample.xml」(適当なフォルダーに)を吐き出し。 ***VB***↓ Imports System.Xml Module Module1 Sub Main(ByVal args() As String) 'XMLファイルの読取り Dim xmlRdr As New XmlTextReader(args(0).Trim()) xmlRdr.Read() Console.WriteLine("タグ名:" + xmlRdr.LocalName) Console.WriteLine("値:" + xmlRdr.ReadString()) xmlRdr.Close() EnD Sub End Module プロジェクトのプロパティページのデバッグでコマンドライン引数指定で「D\Sample.xml」を指定。 しかし、読み込まれるのは\objの\Releaseと\のDebug上のxmlを読み込んでしまいます。しかも自動バックアップ?の関係で上記コードに無い作動(上記だと読み込みだけだが、先に作ったXML作成モジュールを実行してしまう)でXMLを自動作成してしまいます。 好きな場所のファイル名を指定させる方法を教えて下さい。 普段はEclipse+Javaで開発を行っていてEclipseのパス設定感覚ではうまくいかないのですか?

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

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

> コマンドライン引数指定は相対パスを指定するみたいなのですね。 いえ、コマンドラインで絶対パスを指定することも出来ます。 開始オプションのコマンドライン引数に「D:\Sample.xml」と書かれていれば、それは絶対パスです。 この状態でデバッグを開始すると Sub Main(ByVal args() As String) このメソッドの引数である args(0) には "D:\Sample.xml" という文字列が入ります。それでもなお例外が発生したのであれば、ファイルが存在しない・あるいは開けないかXmlの構造が間違っているか、のどちらかでしょう。例外が発生しているのであれば、その理由は分かると思います。 パスは相対パスであれ絶対パスであれ、単なる文字列に過ぎません。コマンドラインも単なる文字列ですから、相対・絶対の両方が指定できます。コマンドラインで与えられたパスをどう扱うかはプログラムしだいです。 誤解されているといけないので念のため。

その他の回答 (2)

回答No.2

> 上記だと読み込みだけだが、先に作ったXML作成モジュールを実行してしまう ご提示したSub Main()自体が実行されていないのでは? プロジェクトのプロパティで、アプリケーションのスタートアップオブジェクトの指定が間違っていないか確認してみてください。 D\Sample.xml が D:\Sample.xml の書き間違いであれば正しく読めるはずですし、「D\Sample.xml」という相対パスが指定されているのであれば、ファイルが見つからずに例外が出るはず。

marugori
質問者

補足

>D\Sample.xml が D:\Sample.xml の書き間違いであれば正しく読めるはずですし、「D\Sample.xml」という相対パスが指定されているのであれば、ファイルが見つからずに例外が出るはず。 書き間違いでした。例外もでました。すみません。 コマンドライン引数指定は相対パスを指定するみたいなのですね。 ありがとうございます。

回答No.1

相対パスで指定している以上,カレントディレクトリからの相対パスになります。 なので,特定の場所が決まっているのであれば,ちゃんと絶対パスで指定してください。 相対パスで指定する場合は,原則的にはbin\Debug\なりbin\Release\なりが基準になるので,そこからの相対パスで指定する必要があります。

marugori
質問者

補足

ありがとうございます。 絶対パスを指定しようとコマンドライン引数指定をしたのですが… 絶対パス指定するにはどうすればいいのでしょう?

関連するQ&A

  • VB.NETSystem.Xml 要素数を得るには

    VB.NETでSystem.Xmlを参照設定して以下のXMLファイル(test.xml)のsub4_9のtestの個数を得たいのですが domNode = domDoc.SelectSingleNode("top/sub4_9/test") Console.WriteLine("Count of top/sub4_9/test = " & domNode.?????) というようにしましたが?????の部分にLengthやCountがありません。 また、 rootElement = domDoc.DocumentElement domNodeList = rootElement.GetElementsByTagName("sub4_9/test") Console.WriteLine("Count of top/sub4_9/test = " & domNodeList.Count) というようにもしてみましたが個数は誤った0が返されます。 どのように記述すればsub4_9のtestの個数を得ることができるでしょうか。 ----test.xml------------- <top>  <sub1_1>   <test>123</test>   <test>451</test>    :  </sub1_1>    :  <sub4_9>   <test>432</test>   <test>123</test>   <test>745</test>    :  </sub4_9>    :  <sub9_5>   <test>222</test>    :  </sub9_5> </top> --VB.NET------------------------ Imports System.Xml Imports System.IO Module Module1  Sub Main()   Dim domDoc As New XmlDocument   Dim domNode As XmlNode   Dim domNodeList As XmlNodeList   Dim rootElement As XmlElement   domDoc.Load("test.xml")   rootElement = domDoc.DocumentElement   domNode = domDoc.SelectSingleNode("top/sub4_9/test")   Console.WriteLine("Count of top/sub4_9/test = " & domNode.?????)   domNodeList = rootElement.GetElementsByTagName("sub4_9/test")   Console.WriteLine("Count of top/sub4_9/test = " & domNodeList.Count)  End Sub End Module ----------------------------------- よろしくお願いします (WindpwsXP,VisualStudio2010)

  • VBで理解ができないところがあります

    初めまして、Y-Kobayashiです。 私はVisualBasicを勉強しているのですが、行き詰っております。 なぜかと言いますと、サンプルプログラムを打ち込んでも、そのままでは実行ができないからです。 使用している書籍は「かんたんVisual Basic(技術評論社)」というものです。 以下が、そのサンプルです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Module Module1 Private mName As String = "YOSHI" Sub Main() Dim SUJI As Integer = 3 If SUJI = 3 Then Console.WriteLine(mName) End If '-> Console.ReadLine() End Sub Sub DispMsg() Console.WriteLine("Hello {0}", mName) End Sub End Module ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Sub Main()内のmNameは表示されるのですが、Sub DispMsg()内のものが表示されないのです。 一応、「'->」のある位置に「DispMsg()」と入れれば実行されるのですが、書籍にはそういった記載がありません。 どうすれば良いのでしょうか? 他にも、Subとはどういう意味なのか、Moduleとはどういう意味なのか、それらはどの様な働きをするのか等、最初から使う物にも関わらず記載がなされていないので、明確に認識ができない状態です。 SubはC言語でいうところの、関数の様なもの。 Moduleはそれらをまとめるグループ(?)もしくは関数の様なもの。 NameSpeaceはModuleをまとめるグループ(?)もしくは関数の様なもの。 という認識を持ちつつありますが、これで合っているのでしょうか? VBの参考書はこういった説明が省かれる傾向があるのでしょうか? 図書館で何冊か見ましたが、途中から出てくる単語の解説が無くなって行きます。 それらは大抵自動で入力されるのですが、意味が分からないと気持ち悪いです。 おすすめの参考書があれば教えてください。 よろしくお願いします。 乱文失礼しました。

  • VB.NETのデリゲートについて

    VB.NETのデリゲートについて質問です。 以下のプログラムなのですが、 デリゲート型をインスタンス化しているところで、コンストラクタにパラメータを渡していますが、 そのコンストラクタはどこに定義されているのでしょうか。 (AddressOf t1.Ohayou)というパラメータが渡されていますが、このパラメータを受け取っているコンストラクタがどれなのかが分かりません。 ご教示よろしくお願いいたします。 Delegate Sub Myprint(ByVal s As String) Module Module1 Sub Main() Dim t1 As Test1 = New Test1() Dim t2 As TEst2 = New Test2() Dim d As Myprint = New Myprint(AddressOf t1.Ohayou) d.Invoke("VB太郎") d = New Myprint(AddressOf t2.Konbanwa) d.Invoke("VB太郎") End Sub End Module Class Test1 Sub Ohayou(ByVal s As String) Console.WriteLine("おはようございます。{0}です。", s) End Sub End Class Class Test2 Sub Konbanwa(ByVal s As String) Console.WriteLine("こんばんわ。{0}です。", s) End Sub End Class

  • vb2005でXmlReaderの使い方

    xmlファイルの読込がうまくいきません。どこが間違っているでしょうか。 参考にしたページ http://msdn.microsoft.com/ja-jp/library/ayf5ffy5(v=vs.80).aspx -----xmlファイルここから----- <root> <parentnode1> <childnode1>100</childnode1> </parentnode1> <parentnode2>20</parentnode2> </root> -----xmlファイルこまで----- -----コードここから----- Sub Main() Dim b As Boolean Dim objXmlR As XmlReader = XmlReader.Create("c:\temp\sample.xml") objXmlR.MoveToContent() b = objXmlR.ReadToDescendant("parentnode1") Console.WriteLine(objXmlR.Name) '「parentnode1」を出力 Console.WriteLine(objXmlR.Value) '「」を出力 b = objXmlR.ReadToDescendant("childnode1") Console.WriteLine(objXmlR.Name) '「childnode1」を出力 Console.WriteLine(objXmlR.Value) '「」を出力。ここで「100」が出て欲しい End Sub -----コードここまで----- 基本的なことだと思いますがよろしくお願いします。

  • 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でByte型の実配列サイズが大きい件

    vb.netでByte型の配列を100byteで宣言しましたが、実際の配列サイズは101byteになりました。 (例) Module Module1 Sub Main() Dim buffSize As Integer = 100 Dim inputBuff(buffSize) As Byte Dim ii As Integer = inputBuff.Length Console.WriteLine("バッファサイズ = {0}", ii) End Sub End Module ここで、iiは、101となります。 CとかC++では、有り得ない仕様ですが、どういう意味が有るのでしょうか? ご教示お願い致します。

  • VB2005でXMLデータの要素があるかどうかの判定について

    VB2005、XMLの初心者です。 XMLデータをMSXMLでパーサーにかけてから全項目を抽出していますが、要素は必須のものもあれば、省略される場合もあります。 下記の方法では、省略されている場合エラーとなってしまうのですが、 指定したパスの要素があるかどうか判定することはできないのでしょうか。 省略される可能性のある場合は、selectsingleNodeではなく、何か別の方法で項目を取得しなければならないのでしょうか。 Private Sub prvParseXML(Byval msxmlDoc As MSXML2.DOMDocument) Dim Item As String Dim TableId As String Item = msxmlDoc.selectsingleNode("/Mml/content/Module/Class/Code").Text TableId = msxmlDoc.selectsingleNode("/Mml/content/Module/Class/@tableId").Text End Sub 項目を抽出する方法は上記しか分からなかったのですが、 何かヒントになることでも良いので皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。

  • VB2005 でパス名が誤っていないかチェックする方法について

    VB2005 の初心者です。 iniファイルで指定したフォルダ(パス)を読み込んで処理をしたいのですが、指定したパスが誤っている場合は、どのようにチェックすれば良いのでしょうか。 下記サンプルのとおり、System.IO.Path.GetInvalidPathChars() でチェックする方法があるようですが、ヘルプには「ファイル名やディレクトリ名としては無効なすべての文字が含まれるかどうかは、保証されません。」とあるようです。 実際、"Cd:\<>Work\Test.txt" というパスにすると、チェックはスルーしてしまいました。 Dim filepath As String = "C:\<>Work\Test.txt" Dim invalidPathChars As Char() = System.IO.Path.GetInvalidPathChars() For Each invalidChar As Char In invalidPathChars If filepath.IndexOf(invalidChar) > -1 Then Console.WriteLine("使用できない文字 " & invalidChar.ToString() & " が含まれています。") End If Next 誤ったパスを完全にチェックする方法はあるのでしょうか。 何かヒントになることでも良いので、皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。

  • 【VB2005】windowsアプリ初心者の素朴な質問

    23歳男性です。 visual studio 2005を使用して開発を行っております。 今まではコンソールアプリを開発してました。今後はwindowsアプリもやることになると思います。そこで前準備としてwindowsアプリについて色々と質問します。 【質問】コンソールアプリでは、例外処理は最上位で行っていました。windowsアプリでも同様のことができると考えていました。しかし、windowsアプリのほうには「main」がないように思います。 これはイベント毎にtry~catch文を記述するしかないのでしょうか?これだと極めてメンテナンスしにくくなっちゃうのですが・・・・・・ --console----------------------------------------------------- Module Module1 Sub Main() Try Process() Catch ex As Exception Console.WriteLine(ex.Message) End Try End Sub Sub process() (処理) End Sub End Module --windows----------------------------------------------------- Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click (try~catch文) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click (try~catch文) End Sub   ・・・・・・・・(イベントが増える毎にtry~catch文記述?) End Class

  • VBの初心者で、仕事で必要になり、現在、勉強中です。

    VBの初心者で、仕事で必要になり、現在、勉強中です。 VB2005で開発したシステムを、VB2010でリビルドして 実行してみたところ。 TypeInitializationException はハンドルされませんでした。 amest2.ModDeclare のタイプ初期化が例外をスローしました。 『 関連のあるソースは以下の通りです。 Option Strict On Option Explicit On Imports System.IO Module ModMain Sub Main() ' 起動カレントフルパスの取得 psFullPath = Application.StartupPath ←ここで発生。 End Sub ↓ End Module Option Strict On Option Explicit On Imports Microsoft.DirectX Module ModDeclare '共通領域宣言モジュール Public psFullPath As String = "" ' 起動端末のカレントフルパス End Module 』 のエラーがでて実行できませんでした。 このエラーは何が原因で発生するのでしょうか? また、VB2005とVB2010の互換性はどうなのでしょうか? リビルドすれば問題ないと思ったのですが? VBでお勧めの書籍があれば教えていただけませんか?  1)初心者向け   (初めてなので、まずは、初心者向けから)  2)VBのことなら何でも載っている   (何かわからないことがあった場合のために、辞典的に使用したい) よろしくお願いします。

専門家に質問してみよう