web-dev-qa-db-ja.com

C#でのXMLファイルパスの読み込み

プロジェクトのフォルダーにあるXMLファイルを読み込もうとしています(Visual Studio 2012を使用)。

構造はこれです:

solutionRoot\
-  service\
--   ServiceClass.cs
--   AppValues.xml  <-- this is the file I want to load

私のServiceClassでは、次のコードを使用してXMLファイルから読み取ろうとしています。

public String GetXmlElement(String elementName)
{
    [....]
    XDocument document = XDocument.Load(@"\service\AppValues.xml");
    [...]
}

コードをテストしようとすると、次のエラーが発生します。

Test method PandaTests.ServiceTest.ReadXmlCanReadXml threw exception: 
System.IO.DirectoryNotFoundException: Could not find a part of the path 
'C:\Users\MyName\Documents\GitHub\project\Project22\PandaTests\bin\Debug\service\AppValues.xml'.

これは明らかに私のパスの問題ですが、相対パスを正しく設定する方法がわかりません。ここでスタックオーバーフローに関する他の質問を見ましたが、それらの多くは過度に関与しているようです。絶対パスを指定せずにXMLファイルをロードする簡単な方法はありますか?

9
Tobias Roland

VSがプログラムを実行すると、作業ディレクトリはソリューションルートではなく、Debug/Releaseフォルダーに設定されます。

私が知っているいくつかのオプションがあります...

  1. 絶対パスを使用しますが、これは不要です
  2. ビルド時に作業ディレクトリにコピーするようにファイルを設定します。これを行うには、ソリューションエクスプローラーでファイルのプロパティを変更します。 以下のコメントでT.Rolandに感謝します:(Copy to Output Directoryto Copy if Newer and setBuild Actionto Embedded Resource;
  3. ソリューションの作業ディレクトリをソリューションルートになるように変更する このスレッド は、さまざまな方法でそれを実現します。
14
Tyler Lee

私は同じ問題に直面し、「Server.MapPath」を使用してそれを解決しました

例えば、

string path=Server.MapPath("~/service/AppValues.xml");

XDocument document = XDocument.Load(path);

それが役に立てば幸い。

4
Sarath Rachuri

AppValues.xmlのVisual Studioのプロパティを表示します。 「出力ディレクトリにコピー」を「新しい場合はコピー」に変更して、プロジェクトをビルドします。

2
jlew

これをチェックして

XDocument document = XDocument.Load(@"..\service\AppValues.xml");
0
K3rnel31

2つのステップで解決しました。私はMVCを使用しており、これをクラスファイルで使用する必要がありました。

1)文字列パス

=HttpContext.Current.Server.MapPath("~/App_Data/yourxmlfilename.xml");
XDocument doc = XDocument.Load(path);

2)XMLファイルのプロパティを変更する

ビルドアクション:コンテンツ
出力ディレクトリにコピー:常にコピー

0
M. Bhavani

Xmlファイルのビルドアクションを「組み込みリソース」に設定し、このコードを使用して参照します

private static UnmanagedMemoryStream GetResourceStream(string resName)
{
    var Assembly = Assembly.GetExecutingAssembly();
    var strResources = Assembly.GetName().Name + ".g.resources";
    var rStream = Assembly.GetManifestResourceStream(strResources);
    var resourceReader = new ResourceReader(rStream);
    var items = resourceReader.OfType<DictionaryEntry>();
    var stream = items.First(x => (x.Key as string) == resName.ToLower()).Value;
    return (UnmanagedMemoryStream)stream;
}

    var file = GetResourceStream("appValues.xml");
0
guymid

Visual Studioプロジェクトにファイルを追加する場合、デフォルトでは、生成された出力にコピーされません。そのため、ファイルをコピーするか、手動でコピーするように設定する必要があります。

ファイルを自動的にコピーするように設定するには、ソリューションエクスプローラーでファイルを選択し、右クリックしてプロパティを選択します。 「出力ディレクトリにコピー」の値を「常にコピー」に更新します。これにより、実行時に結果のソリューションのサブフォルダーでファイルのコピーを利用できるようになります。

次に、次のようなものを使用してファイルをロードできます。

string path = System.Io.Path.Combine(Application.StartupPath, @"\service\AppValues.xml");
XDocument doc = XDocument.Load(path);
0
Kami